From 844f3a5d11e4360e9d6bdb79cfed49287aa8b14d Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Mon, 4 Mar 2024 16:14:28 +0000 Subject: initial commit --- src/element.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/element.rs (limited to 'src/element.rs') diff --git a/src/element.rs b/src/element.rs new file mode 100644 index 0000000..3273ba0 --- /dev/null +++ b/src/element.rs @@ -0,0 +1,55 @@ +// 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" -- cgit