nautilus_codegen/
type_helpers.rs1use nautilus_schema::ir::DefaultValue;
4use nautilus_schema::ir::{FieldIr, ResolvedFieldType, ScalarType};
5
6pub(crate) fn scalar_to_rust_type(scalar: &ScalarType) -> String {
8 scalar.rust_type().to_string()
9}
10
11pub fn field_to_rust_type(field: &FieldIr) -> String {
13 let base_type = match &field.field_type {
14 ResolvedFieldType::Scalar(scalar) => scalar_to_rust_type(scalar),
15 ResolvedFieldType::Enum { enum_name } => enum_name.clone(),
16 ResolvedFieldType::CompositeType { type_name } => type_name.clone(),
17 ResolvedFieldType::Relation(rel) => {
18 if field.is_array {
24 format!("Vec<{}>", rel.target_model)
25 } else {
26 format!("Option<Box<{}>>", rel.target_model)
27 }
28 }
29 };
30
31 if field.is_array && !matches!(field.field_type, ResolvedFieldType::Relation(_)) {
34 format!("Vec<{}>", base_type)
35 } else if !field.is_required && !matches!(field.field_type, ResolvedFieldType::Relation(_)) {
36 format!("Option<{}>", base_type)
37 } else {
38 base_type
39 }
40}
41
42pub fn is_auto_generated(field: &FieldIr) -> bool {
44 if field.computed.is_some() {
45 return true;
46 }
47 if let Some(default) = &field.default_value {
48 matches!(
49 default,
50 DefaultValue::Function(func) if func.name == "autoincrement" || func.name == "uuid"
51 )
52 } else {
53 false
54 }
55}