use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImportInfo {
pub name: String,
pub source: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ForeignTypeAlias {
pub name: String,
pub from: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ForeignTypeConfig {
pub name: String,
pub namespace: Option<String>,
pub from: Vec<String>,
pub serialize_expr: Option<String>,
pub serialize_import: Option<ImportInfo>,
pub deserialize_expr: Option<String>,
pub deserialize_import: Option<ImportInfo>,
pub default_expr: Option<String>,
pub default_import: Option<ImportInfo>,
pub has_shape_expr: Option<String>,
pub has_shape_import: Option<ImportInfo>,
#[serde(default)]
pub aliases: Vec<ForeignTypeAlias>,
#[serde(default)]
pub expression_namespaces: Vec<String>,
}
impl ForeignTypeConfig {
pub fn get_namespace(&self) -> Option<&str> {
if let Some(ref ns) = self.namespace {
return Some(ns);
}
if let Some(dot_idx) = self.name.rfind('.') {
return Some(&self.name[..dot_idx]);
}
None
}
pub fn get_type_name(&self) -> &str {
self.name.rsplit('.').next().unwrap_or(&self.name)
}
pub fn get_qualified_name(&self) -> String {
if let Some(ns) = self.get_namespace() {
let type_name = self.get_type_name();
if ns != type_name {
return format!("{}.{}", ns, type_name);
}
}
self.name.clone()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MacroforgeConfig {
#[serde(default)]
pub keep_decorators: bool,
#[serde(default = "default_generate_convenience_const")]
pub generate_convenience_const: bool,
#[serde(default)]
pub foreign_types: Vec<ForeignTypeConfig>,
#[serde(default, skip_serializing)]
pub config_imports: HashMap<String, ImportInfo>,
}
pub fn default_generate_convenience_const() -> bool {
true
}
impl Default for MacroforgeConfig {
fn default() -> Self {
Self {
keep_decorators: false,
generate_convenience_const: true,
foreign_types: Vec::new(),
config_imports: HashMap::new(),
}
}
}