def write_choice(self, value: Any, var: XmlVar, namespace: NoneStr) -> Generator: """ Produce an events stream for the given value of a compound elements field. The value can be anything as long as we can match the qualified name or its type to a choice. """ if isinstance(value, DerivedElement): choice = var.find_choice(value.qname) value = value.value func = self.write_xsi_type if is_dataclass( value) else self.write_element elif isinstance(value, AnyElement) and value.qname: choice = var.find_choice(value.qname) func = self.write_any_type else: choice = var.find_value_choice(value) func = self.write_value if not choice: raise SerializerError( f"XmlElements undefined choice: `{var.name}` for `{type(value)}`" ) yield from func(value, choice, namespace)
def test_find_choice(self): choices = [ XmlVar(element=True, name="a", qname="{a}a"), XmlVar(element=True, name="b", qname="b"), ] var = XmlVar(elements=True, name="foo", qname="foo", choices=choices) self.assertFalse(var.matches("a")) self.assertIsNone(var.find_choice("a")) self.assertEqual(choices[0], var.find_choice("{a}a")) self.assertTrue(var.matches("{a}a")) self.assertEqual(choices[1], var.find_choice("b")) self.assertTrue(var.matches("b"))
def bind_choice_generic(self, value: Dict, var: XmlVar) -> Any: """Bind data to a either a derived or a user derived model.""" qname = value["qname"] choice = var.find_choice(qname) if not choice: raise ParserError( f"XmlElements undefined choice: `{var.name}` for qname `{qname}`" ) if "value" in value: return DerivedElement(qname, self.bind_value(choice, value["value"])) return self.bind_dataclass(value, AnyElement)