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;
|
||||
|
||||
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(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;
|
||||
|
||||
class TypeMap
|
||||
@@ -166,6 +172,7 @@ class RustStruct_Field
|
||||
public bool field_vector;
|
||||
public bool field_system;
|
||||
public bool field_normal;
|
||||
public bool field_primitive_or_system => field_primitive || field_system;
|
||||
public string rust_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