@@ -89,7 +89,12 @@ def _coerce_resource_field(field_value, field_type):
8989 return {k : _coerce_resource_field (v , field_type = dict_types [1 ]) for k , v in field_value .items ()}
9090
9191 elif field_type is RoleRef :
92- return convert_role_ref (field_value )
92+ if isinstance (field_value , str ) and string_contains_var (field_value ):
93+ return VarString (field_value )
94+ elif isinstance (field_value , (Resource , VarString , str )):
95+ return convert_role_ref (field_value )
96+ else :
97+ raise TypeError
9398
9499 # Check for field_value's type in a Union
95100 elif get_origin (field_type ) == Union :
@@ -139,14 +144,7 @@ def _coerce_resource_field(field_value, field_type):
139144 elif field_type is ResourceTags :
140145 return ResourceTags (field_value )
141146 elif field_type is str :
142- if isinstance (field_value , str ) and string_contains_var (field_value ):
143- return VarString (field_value )
144- elif isinstance (field_value , VarString ):
145- return field_value
146- elif not isinstance (field_value , str ):
147- raise TypeError
148- else :
149- return field_value
147+ return convert_to_varstring (field_value )
150148 elif field_type is float :
151149 if isinstance (field_value , float ):
152150 return field_value
@@ -477,6 +475,15 @@ def _render_vars(field_value):
477475 if isinstance (self , NamedResource ) and isinstance (self ._name , VarString ):
478476 self ._name = ResourceName (self ._name .to_string (vars ))
479477
478+ def _resolve_role_refs (self ):
479+ for f in fields (self ._data ):
480+ if f .type == RoleRef :
481+ field_value = getattr (self ._data , f .name )
482+ new_value = convert_role_ref (field_value )
483+ setattr (self ._data , f .name , new_value )
484+ if new_value .name != "" :
485+ self .requires (new_value )
486+
480487 def to_pointer (self ):
481488 return ResourcePointer (
482489 name = str (self .fqn ),
@@ -639,7 +646,7 @@ def container(self):
639646 @property
640647 def database (self ):
641648 if isinstance (self .scope , DatabaseScope ):
642- return self .container .name
649+ return self .container .name # type: ignore
643650 else :
644651 raise ValueError ("ResourcePointer does not have a database" )
645652
@@ -703,16 +710,15 @@ def convert_to_resource(
703710
704711def convert_role_ref (role_ref : RoleRef ) -> Resource :
705712 if role_ref .__class__ .__name__ == "Role" :
706- return role_ref
713+ return role_ref # type: ignore
707714 elif role_ref .__class__ .__name__ == "DatabaseRole" :
708- return role_ref
715+ return role_ref # type: ignore
709716 elif isinstance (role_ref , ResourcePointer ) and role_ref .resource_type in (
710717 ResourceType .DATABASE_ROLE ,
711718 ResourceType .ROLE ,
712719 ):
713720 return role_ref
714-
715- elif isinstance (role_ref , str ) or isinstance (role_ref , ResourceName ):
721+ elif isinstance (role_ref , (str , ResourceName )):
716722 return ResourcePointer (name = role_ref , resource_type = infer_role_type_from_name (role_ref ))
717723 else :
718724 raise TypeError
@@ -728,3 +734,14 @@ def infer_role_type_from_name(name: Union[str, ResourceName]) -> ResourceType:
728734 return ResourceType .DATABASE_ROLE
729735 else :
730736 return ResourceType .ROLE
737+
738+
739+ def convert_to_varstring (value : Union [str , ResourceName ]) -> Union [VarString , str ]:
740+ if isinstance (value , str ) and string_contains_var (value ):
741+ return VarString (value )
742+ elif isinstance (value , VarString ):
743+ return value
744+ elif not isinstance (value , str ):
745+ raise TypeError
746+ else :
747+ return value
0 commit comments