mirror of
				https://github.com/velopack/velopack.git
				synced 2025-10-25 15:19:22 +00:00 
			
		
		
		
	auto generate python dto's
This commit is contained in:
		| @@ -1,4 +1,4 @@ | |||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using HandlebarsDotNet; | using HandlebarsDotNet; | ||||||
| 
 | 
 | ||||||
| var scriptsDir = Assembly.GetEntryAssembly()! | var scriptsDir = Assembly.GetEntryAssembly()! | ||||||
| @@ -98,6 +98,12 @@ Console.WriteLine("Writing all to file"); | |||||||
| Util.ReplaceTextInFile(rustTypes, "RUST_TYPES", rustCTypes.ToString().ReplaceLineEndings("\n")); | Util.ReplaceTextInFile(rustTypes, "RUST_TYPES", rustCTypes.ToString().ReplaceLineEndings("\n")); | ||||||
| Util.ReplaceTextInFile(rustCppInclude, "CPP_TYPES", cppTypes.ToString().ReplaceLineEndings("\n")); | Util.ReplaceTextInFile(rustCppInclude, "CPP_TYPES", cppTypes.ToString().ReplaceLineEndings("\n")); | ||||||
| 
 | 
 | ||||||
|  | // --- Python asset.rs generation --- | ||||||
|  | string pythonAssetRs = Path.Combine(scriptsDir, "..", "lib-python", "src", "asset.rs"); | ||||||
|  | var pythonAssetTemplate = Handlebars.Compile(File.ReadAllText(Path.Combine(templatesDir, "python_asset.hbs"))); | ||||||
|  | var pythonAsset = pythonAssetTemplate(handlebarData); | ||||||
|  | File.WriteAllText(pythonAssetRs, pythonAsset.ToString().ReplaceLineEndings("\n")); | ||||||
|  | 
 | ||||||
| return 0; | return 0; | ||||||
| 
 | 
 | ||||||
| class TypeMap | class TypeMap | ||||||
| @@ -166,6 +172,7 @@ class RustStruct_Field | |||||||
|     public bool field_vector; |     public bool field_vector; | ||||||
|     public bool field_system; |     public bool field_system; | ||||||
|     public bool field_normal; |     public bool field_normal; | ||||||
|  |     public bool field_primitive_or_system => field_primitive || field_system; | ||||||
|     public string rust_comment; |     public string rust_comment; | ||||||
|     public string cpp_comment; |     public string cpp_comment; | ||||||
| } | } | ||||||
							
								
								
									
										62
									
								
								src/code-generator/Templates/python_asset.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/code-generator/Templates/python_asset.hbs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | // This file is auto-generated. Do not edit by hand. | ||||||
|  | #![allow(non_snake_case)] | ||||||
|  | use pyo3::prelude::*; | ||||||
|  | use velopack::{VelopackAsset, UpdateInfo, UpdateOptions, locator::VelopackLocatorConfig}; | ||||||
|  | use std::path::PathBuf; | ||||||
|  |  | ||||||
|  | {{#each this}} | ||||||
|  | #[pyclass(name = "{{struct_rust_name}}")] | ||||||
|  | #[derive(Debug, Clone, Default)] | ||||||
|  | pub struct Py{{struct_rust_name}} { | ||||||
|  |     {{#each fields}} | ||||||
|  |     pub {{field_name}}: {{#if field_vector}}Vec<{{/if}}{{#if field_optional}}Option<{{/if~}} | ||||||
|  |     {{~#unless field_primitive_or_system}}Py{{/unless}}{{field_rust_type}} | ||||||
|  |     {{~#if field_optional}}>{{/if}}{{#if field_vector}}>{{/if}}, | ||||||
|  |     {{/each}} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<{{struct_rust_name}}> for Py{{struct_rust_name}} { | ||||||
|  |     fn from(value: {{struct_rust_name}}) -> Self { | ||||||
|  |         Py{{struct_rust_name}} { | ||||||
|  |             {{#each fields}} | ||||||
|  |             {{#if field_vector}} | ||||||
|  |             {{field_name}}: value.{{field_name}}.into_iter().map(Into::into).collect(), | ||||||
|  |             {{/if}} | ||||||
|  |             {{#if field_primitive}} | ||||||
|  |             {{field_name}}: value.{{field_name}}, | ||||||
|  |             {{/if}} | ||||||
|  |             {{#if field_optional}} | ||||||
|  |             {{field_name}}: value.{{field_name}}.map(Into::into), | ||||||
|  |             {{else}} | ||||||
|  |             {{#if field_normal}} | ||||||
|  |             {{field_name}}: value.{{field_name}}.into(), | ||||||
|  |             {{/if}} | ||||||
|  |             {{/if}} | ||||||
|  |             {{/each}} | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Into<{{struct_rust_name}}> for Py{{struct_rust_name}} { | ||||||
|  |     fn into(self) -> {{struct_rust_name}} { | ||||||
|  |         {{struct_rust_name}} { | ||||||
|  |             {{#each fields}} | ||||||
|  |             {{#if field_vector}} | ||||||
|  |             {{field_name}}: self.{{field_name}}.into_iter().map(Into::into).collect(), | ||||||
|  |             {{/if}} | ||||||
|  |             {{#if field_primitive}} | ||||||
|  |             {{field_name}}: self.{{field_name}}, | ||||||
|  |             {{/if}} | ||||||
|  |             {{#if field_optional}} | ||||||
|  |             {{field_name}}: self.{{field_name}}.map(Into::into), | ||||||
|  |             {{else}} | ||||||
|  |             {{#if field_normal}} | ||||||
|  |             {{field_name}}: self.{{field_name}}.into(), | ||||||
|  |             {{/if}} | ||||||
|  |             {{/if}} | ||||||
|  |             {{/each}} | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | {{/each}} | ||||||
| @@ -1,205 +0,0 @@ | |||||||
| use pyo3::prelude::*; |  | ||||||
|  |  | ||||||
| use velopack::{VelopackAsset, UpdateInfo}; |  | ||||||
|  |  | ||||||
| #[pyclass(name = "Asset")] |  | ||||||
| #[derive(Debug, Clone)] |  | ||||||
| pub struct PyVelopackAsset(pub VelopackAsset); |  | ||||||
|  |  | ||||||
| #[pymethods] |  | ||||||
| impl PyVelopackAsset { |  | ||||||
|     #[new] |  | ||||||
|     #[pyo3(signature = (package_id=String::new(), version=String::new(), type_=String::new(), file_name=String::new(), sha1=String::new(), sha256=String::new(), size=0, notes_markdown=String::new(), notes_html=String::new()))] |  | ||||||
|     pub fn new( |  | ||||||
|         package_id: String, |  | ||||||
|         version: String, |  | ||||||
|         type_: String, |  | ||||||
|         file_name: String, |  | ||||||
|         sha1: String, |  | ||||||
|         sha256: String, |  | ||||||
|         size: u64, |  | ||||||
|         notes_markdown: String, |  | ||||||
|         notes_html: String, |  | ||||||
|     ) -> Self { |  | ||||||
|         PyVelopackAsset(VelopackAsset { |  | ||||||
|             PackageId: package_id, |  | ||||||
|             Version: version, |  | ||||||
|             Type: type_, |  | ||||||
|             FileName: file_name, |  | ||||||
|             SHA1: sha1, |  | ||||||
|             SHA256: sha256, |  | ||||||
|             Size: size, |  | ||||||
|             NotesMarkdown: notes_markdown, |  | ||||||
|             NotesHtml: notes_html, |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Direct field access - much cleaner! |  | ||||||
|     #[getter] |  | ||||||
|     fn package_id(&self) -> &str { |  | ||||||
|         &self.0.PackageId |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn version(&self) -> &str { |  | ||||||
|         &self.0.Version |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn type_(&self) -> &str { |  | ||||||
|         &self.0.Type |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn file_name(&self) -> &str { |  | ||||||
|         &self.0.FileName |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn sha1(&self) -> &str { |  | ||||||
|         &self.0.SHA1 |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn sha256(&self) -> &str { |  | ||||||
|         &self.0.SHA256 |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn size(&self) -> u64 { |  | ||||||
|         self.0.Size |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn notes_markdown(&self) -> &str { |  | ||||||
|         &self.0.NotesMarkdown |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn notes_html(&self) -> &str { |  | ||||||
|         &self.0.NotesHtml |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn __repr__(&self) -> String { |  | ||||||
|         format!( |  | ||||||
|             "Velopack.Asset(package_id='{}', version='{}', type='{}', file_name='{}', size={})", |  | ||||||
|             self.0.PackageId, self.0.Version, self.0.Type, self.0.FileName, self.0.Size |  | ||||||
|         ) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Conversion traits for seamless interop |  | ||||||
| impl From<VelopackAsset> for PyVelopackAsset { |  | ||||||
|     fn from(asset: VelopackAsset) -> Self { |  | ||||||
|         PyVelopackAsset(asset) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl From<PyVelopackAsset> for VelopackAsset { |  | ||||||
|     fn from(py_asset: PyVelopackAsset) -> Self { |  | ||||||
|         py_asset.0 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl AsRef<VelopackAsset> for PyVelopackAsset { |  | ||||||
|     fn as_ref(&self) -> &VelopackAsset { |  | ||||||
|         &self.0 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #[pyclass(name = "UpdateInfo")] |  | ||||||
| #[derive(Debug, Clone)] |  | ||||||
| pub struct PyUpdateInfo(pub UpdateInfo); |  | ||||||
|  |  | ||||||
| #[pymethods] |  | ||||||
| impl PyUpdateInfo { |  | ||||||
|     #[new] |  | ||||||
|     #[pyo3(signature = (target_full_release, base_release=None, deltas_to_target=Vec::new(), is_downgrade=false))] |  | ||||||
|     pub fn new( |  | ||||||
|         target_full_release: PyVelopackAsset, |  | ||||||
|         base_release: Option<PyVelopackAsset>, |  | ||||||
|         deltas_to_target: Vec<PyVelopackAsset>, |  | ||||||
|         is_downgrade: bool, |  | ||||||
|     ) -> Self { |  | ||||||
|         PyUpdateInfo(UpdateInfo { |  | ||||||
|             TargetFullRelease: target_full_release.into(), |  | ||||||
|             BaseRelease: base_release.map(Into::into), |  | ||||||
|             DeltasToTarget: deltas_to_target.into_iter().map(Into::into).collect(), |  | ||||||
|             IsDowngrade: is_downgrade, |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[staticmethod] |  | ||||||
|     pub fn new_full(target: PyVelopackAsset, is_downgrade: bool) -> PyUpdateInfo { |  | ||||||
|         PyUpdateInfo(UpdateInfo { |  | ||||||
|             TargetFullRelease: target.into(), |  | ||||||
|             BaseRelease: None, |  | ||||||
|             DeltasToTarget: Vec::new(), |  | ||||||
|             IsDowngrade: is_downgrade, |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[staticmethod] |  | ||||||
|     pub fn new_delta( |  | ||||||
|         target: PyVelopackAsset, |  | ||||||
|         base: PyVelopackAsset, |  | ||||||
|         deltas: Vec<PyVelopackAsset>, |  | ||||||
|     ) -> PyUpdateInfo { |  | ||||||
|         let rust_deltas = deltas.into_iter().map(Into::into).collect(); |  | ||||||
|         PyUpdateInfo(UpdateInfo { |  | ||||||
|             TargetFullRelease: target.into(), |  | ||||||
|             BaseRelease: Some(base.into()), |  | ||||||
|             DeltasToTarget: rust_deltas, |  | ||||||
|             IsDowngrade: false, |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn target_full_release(&self) -> PyVelopackAsset { |  | ||||||
|         PyVelopackAsset(self.0.TargetFullRelease.clone()) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn base_release(&self) -> Option<PyVelopackAsset> { |  | ||||||
|         self.0.BaseRelease.clone().map(PyVelopackAsset) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn deltas_to_target(&self) -> Vec<PyVelopackAsset> { |  | ||||||
|         self.0.DeltasToTarget.iter().cloned().map(PyVelopackAsset).collect() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[getter] |  | ||||||
|     fn is_downgrade(&self) -> bool { |  | ||||||
|         self.0.IsDowngrade |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fn __repr__(&self) -> String { |  | ||||||
|         format!( |  | ||||||
|             "UpdateInfo(target_version='{}', has_base_release={}, deltas_count={}, is_downgrade={})", |  | ||||||
|             self.0.TargetFullRelease.Version, |  | ||||||
|             self.0.BaseRelease.is_some(), |  | ||||||
|             self.0.DeltasToTarget.len(), |  | ||||||
|             self.0.IsDowngrade |  | ||||||
|         ) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl From<UpdateInfo> for PyUpdateInfo { |  | ||||||
|     fn from(info: UpdateInfo) -> Self { |  | ||||||
|         PyUpdateInfo(info) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl From<PyUpdateInfo> for UpdateInfo { |  | ||||||
|     fn from(py_info: PyUpdateInfo) -> Self { |  | ||||||
|         py_info.0 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl AsRef<UpdateInfo> for PyUpdateInfo { |  | ||||||
|     fn as_ref(&self) -> &UpdateInfo { |  | ||||||
|         &self.0 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										148
									
								
								src/lib-python/src/types.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								src/lib-python/src/types.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | |||||||
|  | // This file is auto-generated. Do not edit by hand. | ||||||
|  | #![allow(non_snake_case)] | ||||||
|  | use pyo3::prelude::*; | ||||||
|  | use velopack::{VelopackAsset, UpdateInfo, UpdateOptions, locator::VelopackLocatorConfig}; | ||||||
|  | use std::path::PathBuf; | ||||||
|  |  | ||||||
|  | #[pyclass(name = "VelopackLocatorConfig")] | ||||||
|  | #[derive(Debug, Clone, Default)] | ||||||
|  | pub struct PyVelopackLocatorConfig { | ||||||
|  |     pub RootAppDir: PathBuf, | ||||||
|  |     pub UpdateExePath: PathBuf, | ||||||
|  |     pub PackagesDir: PathBuf, | ||||||
|  |     pub ManifestPath: PathBuf, | ||||||
|  |     pub CurrentBinaryDir: PathBuf, | ||||||
|  |     pub IsPortable: bool, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<VelopackLocatorConfig> for PyVelopackLocatorConfig { | ||||||
|  |     fn from(value: VelopackLocatorConfig) -> Self { | ||||||
|  |         PyVelopackLocatorConfig { | ||||||
|  |             RootAppDir: value.RootAppDir.into(), | ||||||
|  |             UpdateExePath: value.UpdateExePath.into(), | ||||||
|  |             PackagesDir: value.PackagesDir.into(), | ||||||
|  |             ManifestPath: value.ManifestPath.into(), | ||||||
|  |             CurrentBinaryDir: value.CurrentBinaryDir.into(), | ||||||
|  |             IsPortable: value.IsPortable, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Into<VelopackLocatorConfig> for PyVelopackLocatorConfig { | ||||||
|  |     fn into(self) -> VelopackLocatorConfig { | ||||||
|  |         VelopackLocatorConfig { | ||||||
|  |             RootAppDir: self.RootAppDir.into(), | ||||||
|  |             UpdateExePath: self.UpdateExePath.into(), | ||||||
|  |             PackagesDir: self.PackagesDir.into(), | ||||||
|  |             ManifestPath: self.ManifestPath.into(), | ||||||
|  |             CurrentBinaryDir: self.CurrentBinaryDir.into(), | ||||||
|  |             IsPortable: self.IsPortable, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[pyclass(name = "VelopackAsset")] | ||||||
|  | #[derive(Debug, Clone, Default)] | ||||||
|  | pub struct PyVelopackAsset { | ||||||
|  |     pub PackageId: String, | ||||||
|  |     pub Version: String, | ||||||
|  |     pub Type: String, | ||||||
|  |     pub FileName: String, | ||||||
|  |     pub SHA1: String, | ||||||
|  |     pub SHA256: String, | ||||||
|  |     pub Size: u64, | ||||||
|  |     pub NotesMarkdown: String, | ||||||
|  |     pub NotesHtml: String, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<VelopackAsset> for PyVelopackAsset { | ||||||
|  |     fn from(value: VelopackAsset) -> Self { | ||||||
|  |         PyVelopackAsset { | ||||||
|  |             PackageId: value.PackageId.into(), | ||||||
|  |             Version: value.Version.into(), | ||||||
|  |             Type: value.Type.into(), | ||||||
|  |             FileName: value.FileName.into(), | ||||||
|  |             SHA1: value.SHA1.into(), | ||||||
|  |             SHA256: value.SHA256.into(), | ||||||
|  |             Size: value.Size, | ||||||
|  |             NotesMarkdown: value.NotesMarkdown.into(), | ||||||
|  |             NotesHtml: value.NotesHtml.into(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Into<VelopackAsset> for PyVelopackAsset { | ||||||
|  |     fn into(self) -> VelopackAsset { | ||||||
|  |         VelopackAsset { | ||||||
|  |             PackageId: self.PackageId.into(), | ||||||
|  |             Version: self.Version.into(), | ||||||
|  |             Type: self.Type.into(), | ||||||
|  |             FileName: self.FileName.into(), | ||||||
|  |             SHA1: self.SHA1.into(), | ||||||
|  |             SHA256: self.SHA256.into(), | ||||||
|  |             Size: self.Size, | ||||||
|  |             NotesMarkdown: self.NotesMarkdown.into(), | ||||||
|  |             NotesHtml: self.NotesHtml.into(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[pyclass(name = "UpdateInfo")] | ||||||
|  | #[derive(Debug, Clone, Default)] | ||||||
|  | pub struct PyUpdateInfo { | ||||||
|  |     pub TargetFullRelease: PyVelopackAsset, | ||||||
|  |     pub BaseRelease: Option<PyVelopackAsset>, | ||||||
|  |     pub DeltasToTarget: Vec<PyVelopackAsset>, | ||||||
|  |     pub IsDowngrade: bool, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<UpdateInfo> for PyUpdateInfo { | ||||||
|  |     fn from(value: UpdateInfo) -> Self { | ||||||
|  |         PyUpdateInfo { | ||||||
|  |             TargetFullRelease: value.TargetFullRelease.into(), | ||||||
|  |             BaseRelease: value.BaseRelease.map(Into::into), | ||||||
|  |             DeltasToTarget: value.DeltasToTarget.into_iter().map(Into::into).collect(), | ||||||
|  |             IsDowngrade: value.IsDowngrade, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Into<UpdateInfo> for PyUpdateInfo { | ||||||
|  |     fn into(self) -> UpdateInfo { | ||||||
|  |         UpdateInfo { | ||||||
|  |             TargetFullRelease: self.TargetFullRelease.into(), | ||||||
|  |             BaseRelease: self.BaseRelease.map(Into::into), | ||||||
|  |             DeltasToTarget: self.DeltasToTarget.into_iter().map(Into::into).collect(), | ||||||
|  |             IsDowngrade: self.IsDowngrade, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[pyclass(name = "UpdateOptions")] | ||||||
|  | #[derive(Debug, Clone, Default)] | ||||||
|  | pub struct PyUpdateOptions { | ||||||
|  |     pub AllowVersionDowngrade: bool, | ||||||
|  |     pub ExplicitChannel: Option<String>, | ||||||
|  |     pub MaximumDeltasBeforeFallback: i32, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<UpdateOptions> for PyUpdateOptions { | ||||||
|  |     fn from(value: UpdateOptions) -> Self { | ||||||
|  |         PyUpdateOptions { | ||||||
|  |             AllowVersionDowngrade: value.AllowVersionDowngrade, | ||||||
|  |             ExplicitChannel: value.ExplicitChannel.map(Into::into), | ||||||
|  |             MaximumDeltasBeforeFallback: value.MaximumDeltasBeforeFallback, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Into<UpdateOptions> for PyUpdateOptions { | ||||||
|  |     fn into(self) -> UpdateOptions { | ||||||
|  |         UpdateOptions { | ||||||
|  |             AllowVersionDowngrade: self.AllowVersionDowngrade, | ||||||
|  |             ExplicitChannel: self.ExplicitChannel.map(Into::into), | ||||||
|  |             MaximumDeltasBeforeFallback: self.MaximumDeltasBeforeFallback, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user