diff options
author | cel 🌸 <cel@blos.sm> | 2024-06-29 17:06:08 +0100 |
---|---|---|
committer | cel 🌸 <cel@blos.sm> | 2024-06-29 17:06:08 +0100 |
commit | 6b471061157ee1873d7ac4f3e30cd501d27dcb5a (patch) | |
tree | 8187081b398c715e72c461682d62db1eb428a39f | |
parent | 1f0103cbecc6a4dfe3f34fb6441d4d491b385142 (diff) | |
download | peanuts-main.tar.gz peanuts-main.tar.bz2 peanuts-main.zip |
-rw-r--r-- | src/element.rs | 12 | ||||
-rw-r--r-- | src/reader.rs | 45 |
2 files changed, 45 insertions, 12 deletions
diff --git a/src/element.rs b/src/element.rs index 4dcb616..35d73a3 100644 --- a/src/element.rs +++ b/src/element.rs @@ -9,7 +9,7 @@ pub struct Namespace { namespace: String, } -// names are qualified, they contain the namespace +// names are qualified, they contain a reference to the namespace (held within the reader/writer) pub struct Name { namespace: String, name: String, @@ -22,27 +22,27 @@ pub enum Node { // should this be a trait? pub struct Element { - name: Name, + pub name: Name, // namespace: Name, // 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>, + pub namespace_decl: 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>>, + pub attributes: HashMap<Name, String>, + pub 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")] +// #[peanuts(xmlns = "jabber:client", xmlns:stream = "http://etherx.jabber.org/streams", prefix = "stream")] // pub struct Stream { // from: JID, // id: String, diff --git a/src/reader.rs b/src/reader.rs index 2785c88..b0d21db 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,6 +1,6 @@ use futures::Stream; use nom::Err; -use std::str; +use std::{collections::BTreeMap, str}; use tokio::io::AsyncBufReadExt; use crate::{ @@ -30,8 +30,8 @@ impl<R> Reader<R> where R: AsyncBufReadExt + Unpin, { - /// reads entire next prolog, element, or misc - pub async fn read<'s>(&'s mut self) -> Result<crate::xml::Element<'s>, Error> { + /// could resursively read and include namespace tree with values to be shadowed within new local context + async fn read_recursive(&mut self, namespaces: BTreeMap<Option<String>, String>) -> Result<Element, Error> { let element; let len; loop { @@ -45,15 +45,48 @@ where } Err(e) => match e { Err::Incomplete(_) => (), - e => return Err(Error::ParseError(input.to_owned())), + e => return Err::<E, Error>(Error::ParseError(input.to_owned())), }, } } - self.inner.consume(len); - // Ok(element) + let final; + match element { + crate::xml::Element::Empty(e) => { + let final = Element { + + } + }, + crate::xml::Element::NotEmpty(_, _, _) => todo!(), + } + + self.inner.consume(len); todo!() } + /// reads entire next prolog, element, or misc + // pub async fn read<E: From<Element>>(&mut self) -> Result<E, Error> { + // let element; + // let len; + // loop { + // let buf = self.inner.fill_buf().await?; + // let input = str::from_utf8(buf)?; + // match crate::xml::element(input) { + // Ok((rest, e)) => { + // element = e; + // len = buf.len() - rest.len(); + // break; + // } + // Err(e) => match e { + // Err::Incomplete(_) => (), + // e => return Err::<E, Error>(Error::ParseError(input.to_owned())), + // }, + // } + // } + // self.inner.consume(len); + + // // Ok(element) + // todo!() + // } // pub async fn read_start(&self) -> Result<impl From<Element>, Error> { // todo!() // } |