11import functools
2- from dataclasses import dataclass , field
2+ from dataclasses import dataclass , field , Field , fields
33from inspect import signature
44from typing import Any , Dict , Callable , TypeVar , Generic , Optional , List , Set , Iterable , Type , Union
55
@@ -29,6 +29,14 @@ def set(self, node: Node, value):
2929 return setattr (node , self .name , value )
3030
3131
32+ def field_of (cl : type , name : str ) -> Field :
33+ class_fields = fields (cl )
34+ for fld in class_fields :
35+ if fld .name == name :
36+ return fld
37+ raise Exception (f"Field { name } not found in { cl } " )
38+
39+
3240@dataclass
3341class NodeFactory (Generic [Source , Output ]):
3442 constructor : node_factory_constructor_type
@@ -37,8 +45,8 @@ class NodeFactory(Generic[Source, Output]):
3745
3846 def with_child (
3947 self ,
40- setter : Union [Callable [[Target , Optional [Child ]], None ], PropertyRef ],
41- getter : Union [Callable [[Source ], Optional [Any ]], PropertyRef ],
48+ setter : Union [Callable [[Target , Optional [Child ]], None ], PropertyRef , Field ],
49+ getter : Union [Callable [[Source ], Optional [Any ]], PropertyRef , Field ],
4250 name : Optional [str ] = None ,
4351 target_type : Optional [type ] = None
4452 ) -> "NodeFactory[Source, Output]" :
@@ -50,8 +58,12 @@ def with_child(
5058 prefix = ""
5159 if isinstance (getter , PropertyRef ):
5260 getter = getter .get
61+ elif isinstance (getter , Field ):
62+ getter = PropertyRef (getter .name ).get
5363 if isinstance (setter , PropertyRef ):
5464 setter = setter .set
65+ elif isinstance (setter , Field ):
66+ setter = PropertyRef (setter .name ).set
5567 self .children [prefix + name ] = ChildNodeFactory (prefix + name , getter , setter )
5668 return self
5769
0 commit comments