Skip to content

Commit 098abfa

Browse files
committed
refactor: nodes in return are ids
1 parent 2eecce5 commit 098abfa

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

codegen/src/lib.rs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ fn generate_member(aspect_id: u64, aspect_name: &str, member: &Member) -> TokenS
410410
let return_type = member
411411
.return_type
412412
.as_ref()
413-
.map(|r| generate_argument_type(r, false, true))
413+
.map(generate_return_type)
414414
.unwrap_or_else(|| quote!(()));
415415
let name_str = name.to_string();
416416

@@ -503,7 +503,7 @@ fn generate_run_member(aspect_name: &Ident, _type: MemberType, member: &Member)
503503
}
504504
})
505505
.unwrap_or_default();
506-
let serialize = generate_argument_serialize(
506+
let serialize = generate_return_serialize(
507507
"result",
508508
&member.return_type.clone().unwrap_or(ArgumentType::Empty),
509509
false,
@@ -592,16 +592,38 @@ fn generate_argument_serialize(
592592
argument_name: &str,
593593
argument_type: &ArgumentType,
594594
optional: bool,
595+
) -> TokenStream {
596+
generate_argument_serialize_inner(argument_name, argument_type, optional, false)
597+
}
598+
599+
fn generate_return_serialize(
600+
argument_name: &str,
601+
argument_type: &ArgumentType,
602+
optional: bool,
603+
) -> TokenStream {
604+
generate_argument_serialize_inner(argument_name, argument_type, optional, true)
605+
}
606+
607+
fn generate_argument_serialize_inner(
608+
argument_name: &str,
609+
argument_type: &ArgumentType,
610+
optional: bool,
611+
is_return: bool,
595612
) -> TokenStream {
596613
let name = Ident::new(&argument_name.to_case(Case::Snake), Span::call_site());
597614
match argument_type {
598-
ArgumentType::Node {
599-
_type,
600-
return_id_parameter_name: _,
601-
} => match optional {
602-
true => quote!(#name.map(|n| n.get_id())),
603-
false => quote!(#name.get_id()),
604-
},
615+
ArgumentType::Node { .. } => {
616+
if is_return {
617+
// For return values, the value is already an Id, just use it directly
618+
quote!(#name)
619+
} else {
620+
// For arguments, the value is Arc<Node>, need to call get_id()
621+
match optional {
622+
true => quote!(#name.map(|n| n.get_id())),
623+
false => quote!(#name.get_id()),
624+
}
625+
}
626+
}
605627
ArgumentType::Color => quote!([#name.c.r, #name.c.g, #name.c.b, #name.a]),
606628
ArgumentType::Vec(v) => {
607629
let mapping = generate_argument_serialize("a", v, false);
@@ -619,6 +641,13 @@ fn generate_argument_decl(argument: &Argument, owned_values: bool) -> TokenStrea
619641
let mut _type = generate_argument_type(&argument._type, argument.optional, owned_values);
620642
quote!(#name: #_type)
621643
}
644+
fn generate_return_type(argument_type: &ArgumentType) -> TokenStream {
645+
// For return types, if it's a Node, we allow returning just Id instead of Arc<Node>
646+
match argument_type {
647+
ArgumentType::Node { .. } => quote!(crate::nodes::Id),
648+
_ => generate_argument_type(argument_type, false, true),
649+
}
650+
}
622651
fn argument_type_option_name(argument_type: &ArgumentType) -> String {
623652
match argument_type {
624653
ArgumentType::Empty => "Empty".to_string(),

src/nodes/fields.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,8 @@ impl InterfaceAspect for Interface {
368368
_node: Arc<Node>,
369369
calling_client: Arc<Client>,
370370
uid: Id,
371-
) -> Result<Arc<Node>> {
372-
Ok(EXPORTED_FIELDS
371+
) -> Result<Id> {
372+
let node = EXPORTED_FIELDS
373373
.lock()
374374
.get(&uid.0)
375375
.and_then(|s| s.upgrade())
@@ -382,7 +382,8 @@ impl InterfaceAspect for Interface {
382382
)
383383
.unwrap()
384384
})
385-
.ok_or_eyre("Couldn't import field with that ID")?)
385+
.ok_or_eyre("Couldn't import field with that ID")?;
386+
Ok(node.get_id())
386387
}
387388

388389
fn create_field(

src/nodes/spatial.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -492,8 +492,8 @@ impl InterfaceAspect for Interface {
492492
_node: Arc<Node>,
493493
calling_client: Arc<Client>,
494494
uid: Id,
495-
) -> Result<Arc<Node>> {
496-
Ok(EXPORTED_SPATIALS
495+
) -> Result<Id> {
496+
let node = EXPORTED_SPATIALS
497497
.lock()
498498
.get(&uid.0)
499499
.and_then(|s| s.upgrade())
@@ -506,6 +506,7 @@ impl InterfaceAspect for Interface {
506506
)
507507
.unwrap()
508508
})
509-
.ok_or_eyre("Couldn't find spatial with that ID")?)
509+
.ok_or_eyre("Couldn't find spatial with that ID")?;
510+
Ok(node.get_id())
510511
}
511512
}

0 commit comments

Comments
 (0)