aboutsummaryrefslogtreecommitdiffstats
path: root/src/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/element.rs')
-rw-r--r--src/element.rs55
1 files changed, 55 insertions, 0 deletions
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<String>,
+ 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<Option<String>, 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<Name, String>,
+ children: Option<Vec<Node>>,
+}
+
+// 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"