feat: Update to latest iced

This commit is contained in:
uttarayan21
2025-11-18 23:54:27 +05:30
parent a6ef6ba9c0
commit 3222c26bb6
15 changed files with 1231 additions and 4918 deletions

View File

@@ -11,4 +11,4 @@ proc-macro2 = "1.0.103"
quote = "1.0.41"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
syn = { version = "2.0.108", features = ["full", "parsing"] }
syn = { version = "2.0.108", features = ["extra-traits", "full", "parsing"] }

View File

@@ -3,7 +3,7 @@ use indexmap::IndexMap;
const KEYWORDS: &[&str] = &[
"type", "match", "enum", "struct", "fn", "mod", "pub", "use", "crate", "self", "super", "as",
"in", "let", "mut", "ref", "static", "trait", "where",
"in", "let", "mut", "ref", "static", "trait", "where", "box",
];
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone)]
@@ -15,6 +15,7 @@ pub struct JellyfinOpenapi {
pub struct Components {
schemas: indexmap::IndexMap<String, Schema>,
}
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone)]
pub struct Schema {
#[serde(rename = "type")]
@@ -46,12 +47,15 @@ pub struct Property {
nullable: Option<bool>,
format: Option<String>,
items: Option<Box<Property>>,
properties: Option<indexmap::IndexMap<String, Property>>,
#[serde(rename = "additionalProperties")]
additional_properties: Option<Box<Property>>,
#[serde(rename = "enum")]
_enum: Option<Vec<String>>,
#[serde(rename = "allOf")]
all_of: Option<Vec<RefName>>,
#[serde(rename = "oneOf")]
one_of: Option<Vec<RefName>>,
description: Option<String>,
#[serde(rename = "$ref")]
_ref: Option<String>,
@@ -62,7 +66,7 @@ impl Property {
let out = match self._type {
Some(Types::String) => match self.format.as_deref() {
Some("uuid") => "uuid::Uuid".to_string(),
Some("date-time") => "jiff::Zoned".to_string(),
Some("date-time") => "jiff::Timestamp".to_string(),
_ => "String".to_string(),
},
Some(Types::Integer) => match self.format.as_deref() {
@@ -89,6 +93,8 @@ impl Property {
"std::collections::HashMap<String, {}>",
properties.to_string()
)
// } else if let Some(props) = &self.properties {
// todo!()
} else {
"std::collections::HashMap<String, serde_json::Value>".to_string()
}
@@ -115,7 +121,7 @@ impl Property {
}
}
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone)]
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Types {
Object,
@@ -144,73 +150,10 @@ fn main() {
.map(|(k, v)| (k.clone(), v.clone()))
.collect();
let syn_structs: Vec<syn::ItemStruct> = structs
let syn_structs: Vec<syn::Item> = structs
.iter()
.map(|(key, value)| {
let fields = value
.properties
.as_ref()
.expect("Possible properties")
.iter()
.map(|(name, _type)| {
let og_name = name.clone();
let name = modify_keyword(&name.to_snake_case());
let _type_desc = _type.description();
let _type_desc = if let Some(desc) = &_type_desc {
Some(format!(" {}", desc))
} else {
None
};
let _type = _type.to_string();
let _type = if _type.contains(key) {
_type.replace(&format!("<{}>", key), format!("<Box<{}>>", key).as_str())
} else {
_type
};
syn::Field {
attrs: if let Some(desc) = _type_desc {
syn::parse_quote! {
#[doc = #desc]
#[serde(rename = #og_name)]
}
} else {
syn::parse_quote! {
#[serde(rename = #og_name)]
}
},
mutability: syn::FieldMutability::None,
vis: syn::Visibility::Public(syn::Token![pub](
proc_macro2::Span::call_site(),
)),
ident: Some(syn::Ident::new(&name, proc_macro2::Span::call_site())),
colon_token: Some(syn::token::Colon(proc_macro2::Span::call_site())),
ty: syn::parse_str(&_type).expect("Failed to parse type"),
}
})
.collect::<Vec<syn::Field>>();
let key = modify_keyword(key);
let desc = value.description.clone();
let key = syn::Ident::new(&key.to_pascal_case(), proc_macro2::Span::call_site());
let tokens = if let Some(desc) = desc {
let desc = format!(" {}", desc);
quote::quote! {
#[doc = #desc]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct #key {
#(#fields),*
}
}
} else {
quote::quote! {
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct #key {
#(#fields),*
}
}
};
syn::parse2(tokens).expect("Failed to parse struct")
})
.map(|(key, value)| generate_struct(key, value))
.flatten()
.collect();
let syn_enums = enums
@@ -262,7 +205,6 @@ fn main() {
attrs: vec![],
items: syn_structs
.into_iter()
.map(syn::Item::Struct)
.chain(syn_enums.into_iter().map(syn::Item::Enum))
.collect(),
};
@@ -277,3 +219,104 @@ fn modify_keyword(name: &str) -> String {
name.to_string()
}
}
fn generate_struct(key: impl AsRef<str>, value: &Schema) -> Vec<syn::Item> {
let key = key.as_ref();
let extra_structs = value
.properties
.as_ref()
.expect("Possible properties")
.iter()
.filter_map(|(name, property)| {
if property._type == Some(Types::Object) && property.properties.is_some() {
Some(generate_struct(
&format!("{}_{}", key, name),
&Schema {
_type: Types::Object,
properties: property.properties.clone(),
one_of: None,
_enum: None,
description: property.description.clone(),
},
))
} else {
None
}
})
.flatten()
.collect::<Vec<syn::Item>>();
let fields = value
.properties
.as_ref()
.expect("Possible properties")
.iter()
.map(|(name, property)| {
let nested_struct =
property._type == Some(Types::Object) && property.properties.is_some();
let og_name = name.clone();
let name = modify_keyword(&name.to_snake_case());
let _type_desc = property.description();
let _type_desc = if let Some(desc) = &_type_desc {
Some(format!(" {}", desc))
} else {
None
};
let _type = if !nested_struct {
property.to_string()
} else {
format!("{}_{}", key, og_name).to_pascal_case()
};
let _type = if _type.contains(key) {
_type.replace(&format!("<{}>", key), format!("<Box<{}>>", key).as_str())
} else {
_type
};
syn::Field {
attrs: if let Some(desc) = _type_desc {
syn::parse_quote! {
#[doc = #desc]
#[serde(rename = #og_name)]
}
} else {
syn::parse_quote! {
#[serde(rename = #og_name)]
}
},
mutability: syn::FieldMutability::None,
vis: syn::Visibility::Public(syn::Token![pub](proc_macro2::Span::call_site())),
ident: Some(syn::Ident::new(&name, proc_macro2::Span::call_site())),
colon_token: Some(syn::token::Colon(proc_macro2::Span::call_site())),
ty: syn::parse_str(&_type).expect("Failed to parse type"),
}
})
.collect::<Vec<syn::Field>>();
let key = modify_keyword(key);
let desc = value.description.clone();
let key = syn::Ident::new(&key.to_pascal_case(), proc_macro2::Span::call_site());
let tokens = if let Some(desc) = desc {
let desc = format!(" {}", desc);
quote::quote! {
#[doc = #desc]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct #key {
#(#fields),*
}
}
} else {
quote::quote! {
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct #key {
#(#fields),*
}
}
};
let mut out = syn::parse2::<syn::File>(tokens)
.expect("Failed to parse struct")
.items;
out.extend(extra_structs);
out
}