// elements resemble a final tree, including inherited namespace information use std::collections::HashMap; // when are namespaces names chosen then if they are automatically calculated // namespaces are held by readers and writers. pub struct Namespace { prefix: Option, namespace: String, } // names are qualified, they contain the namespace pub struct Name { namespace: String, name: String, } pub enum Node { Element(Element), Text(String), } // should this be a trait? pub struct Element { name: Name, // namespace: (Name, String), // can't have this, must be external method that is called within the context of a reader/writer // each element once created contains the qualified namespace information for that element // the name contains the qualified namespace so this is unnecessary // namespace: String, // hashmap of explicit namespace declarations on the element itself only // possibly not needed as can be calculated at write time depending on context and qualified namespace, and for reading, element validity and namespaces are kept track of by the reader. // namespaces: HashMap, String>, // attributes can be in a different namespace than the element. how to make sure they are valid? // maybe include the namespace instead of or with the prefix // you can calculate the prefix from the namespaced name and the current writer context // you can validate the prefix and calculate the namespace from the current reader context // this results in readers and writers being able to return qualification errors as they aren't able to create elements until every part is qualified. attributes: HashMap, children: Option>, } // example of deriving an element: // #[derive(XMLWrite, XMLRead)] // #[peanuts(namespace = "jabber:client", namespace:stream = "http://etherx.jabber.org/streams", name = "stream:stream")] // pub struct Stream { // from: JID, // id: String, // to: JID, // version: String, // #[peanuts(namespace = "http://www.w3.org/XML/1998/namespace")] // lang: Lang, // } // note: if an element name has a prefix all unprefixed attributes are qualified by the namespace of the prefix, so in this example from's Name's namespace would be "http://etherx.jabber.org/streams"