field.mojo (1726B)
1 from std.collections import Optional 2 3 4 @fieldwise_init 5 struct DecodedField(Copyable, Movable): 6 var state: String 7 var value: Optional[String] 8 var qualifier: String 9 var method: String 10 11 12 def known_field(value: String, method: String) raises -> DecodedField: 13 if method.strip() == "": 14 raise Error("field method must not be empty") 15 return DecodedField( 16 state="known", 17 value=Optional[String](String(value)), 18 qualifier="exact", 19 method=String(method), 20 ) 21 22 23 def known_approximate_field( 24 value: String, method: String 25 ) raises -> DecodedField: 26 var field = known_field(value, method) 27 field.qualifier = "approximate" 28 return field^ 29 30 31 def unresolved_field(method: String) raises -> DecodedField: 32 if method.strip() == "": 33 raise Error("field method must not be empty") 34 return DecodedField( 35 state="unresolved", 36 value=None, 37 qualifier="unknown", 38 method=String(method), 39 ) 40 41 42 def field_is_known(field: DecodedField) -> Bool: 43 if field.state != "known": 44 return False 45 if not field.value: 46 return False 47 return True 48 49 50 def field_known_or(field: DecodedField, fallback: String) -> String: 51 if field_is_known(field): 52 return field.value.value() 53 return String(fallback) 54 55 56 def validate_field_consistency(field: DecodedField) raises: 57 if field.state == "known" and not field.value: 58 raise Error("known field must carry a value") 59 if field.state == "unresolved" and field.value: 60 raise Error("unresolved field must not carry a value") 61 if field.state != "known" and field.state != "unresolved": 62 raise Error("field state must be 'known' or 'unresolved'")