automatically declare default namespaces unless overriden
This commit is contained in:
		
							parent
							
								
									87e6ff405b
								
							
						
					
					
						commit
						381af38a09
					
				|  | @ -58,7 +58,8 @@ pub struct Element { | |||
|     // 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.
 | ||||
|     pub namespace_declarations: HashSet<NamespaceDeclaration>, | ||||
|     // change this to custom namespace declarations only, so you can override the definition of namespaces if you wish
 | ||||
|     pub namespace_declaration_overrides: HashSet<NamespaceDeclaration>, | ||||
|     // 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
 | ||||
|  |  | |||
|  | @ -1,6 +1,9 @@ | |||
| use std::{num::ParseIntError, str::Utf8Error}; | ||||
| 
 | ||||
| use crate::element::{Content, Name, NamespaceDeclaration}; | ||||
| use crate::{ | ||||
|     element::{Content, Name, NamespaceDeclaration}, | ||||
|     Element, | ||||
| }; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum Error { | ||||
|  |  | |||
|  | @ -436,7 +436,7 @@ impl<R> Reader<R> { | |||
| 
 | ||||
|         return Ok(Element { | ||||
|             name: element_name, | ||||
|             namespace_declarations: element_namespace_declarations, | ||||
|             namespace_declaration_overrides: element_namespace_declarations, | ||||
|             attributes, | ||||
|             content: Vec::new(), | ||||
|         }); | ||||
|  | @ -657,7 +657,7 @@ impl<R> Reader<R> { | |||
| 
 | ||||
|         return Ok(Element { | ||||
|             name: element_name, | ||||
|             namespace_declarations: element_namespace_declarations, | ||||
|             namespace_declaration_overrides: element_namespace_declarations, | ||||
|             attributes, | ||||
|             content, | ||||
|         }); | ||||
|  |  | |||
|  | @ -93,20 +93,38 @@ impl<W: AsyncWrite + Unpin + Send> Writer<W> { | |||
|     } | ||||
| 
 | ||||
|     pub async fn write_empty(&mut self, element: &Element) -> Result<()> { | ||||
|         let namespace_declarations_stack: Vec<_> = self | ||||
|         let mut namespace_declarations_stack: Vec<_> = self | ||||
|             .namespace_declarations | ||||
|             .iter() | ||||
|             .flatten() | ||||
|             .chain(&element.namespace_declarations) | ||||
|             .chain(&element.namespace_declaration_overrides) | ||||
|             .collect(); | ||||
| 
 | ||||
|         let mut namespace_declarations = element.namespace_declaration_overrides.clone(); | ||||
| 
 | ||||
|         let default_namespace_declaration; | ||||
|         let prefix; | ||||
|         if let Some(namespace) = &element.name.namespace { | ||||
|             let name_namespace_declaration = namespace_declarations_stack | ||||
|             if let Some(name_namespace_declaration) = namespace_declarations_stack | ||||
|                 .iter() | ||||
|                 .rfind(|namespace_declaration| namespace_declaration.namespace == *namespace) | ||||
|                 .ok_or(Error::UndeclaredNamespace(namespace.clone()))?; | ||||
|             prefix = name_namespace_declaration.prefix.as_ref(); | ||||
|             { | ||||
|                 prefix = name_namespace_declaration.prefix.as_ref(); | ||||
|             } else { | ||||
|                 default_namespace_declaration = NamespaceDeclaration { | ||||
|                     prefix: None, | ||||
|                     namespace: namespace.clone(), | ||||
|                 }; | ||||
|                 if namespace_declarations.insert(default_namespace_declaration.clone()) { | ||||
|                     namespace_declarations_stack.push(&default_namespace_declaration); | ||||
|                     prefix = None | ||||
|                 } else { | ||||
|                     return Err(Error::DuplicateNameSpaceDeclaration(NamespaceDeclaration { | ||||
|                         prefix: None, | ||||
|                         namespace: namespace.clone(), | ||||
|                     })); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             prefix = None | ||||
|         } | ||||
|  | @ -125,7 +143,7 @@ impl<W: AsyncWrite + Unpin + Send> Writer<W> { | |||
| 
 | ||||
|         let mut attributes = Vec::new(); | ||||
| 
 | ||||
|         for namespace_declaration in &element.namespace_declarations { | ||||
|         for namespace_declaration in namespace_declarations.iter() { | ||||
|             let ns_name = namespace_declaration | ||||
|                 .prefix | ||||
|                 .as_ref() | ||||
|  | @ -180,20 +198,38 @@ impl<W: AsyncWrite + Unpin + Send> Writer<W> { | |||
|     } | ||||
| 
 | ||||
|     pub async fn write_element_start(&mut self, element: &Element) -> Result<()> { | ||||
|         let namespace_declarations_stack: Vec<_> = self | ||||
|         let mut namespace_declarations_stack: Vec<_> = self | ||||
|             .namespace_declarations | ||||
|             .iter() | ||||
|             .flatten() | ||||
|             .chain(&element.namespace_declarations) | ||||
|             .chain(&element.namespace_declaration_overrides) | ||||
|             .collect(); | ||||
| 
 | ||||
|         let mut namespace_declarations = element.namespace_declaration_overrides.clone(); | ||||
| 
 | ||||
|         let default_namespace_declaration; | ||||
|         let prefix; | ||||
|         if let Some(namespace) = &element.name.namespace { | ||||
|             let name_namespace_declaration = namespace_declarations_stack | ||||
|             if let Some(name_namespace_declaration) = namespace_declarations_stack | ||||
|                 .iter() | ||||
|                 .rfind(|namespace_declaration| namespace_declaration.namespace == *namespace) | ||||
|                 .ok_or(Error::UndeclaredNamespace(namespace.clone()))?; | ||||
|             prefix = name_namespace_declaration.prefix.as_ref(); | ||||
|             { | ||||
|                 prefix = name_namespace_declaration.prefix.as_ref(); | ||||
|             } else { | ||||
|                 default_namespace_declaration = NamespaceDeclaration { | ||||
|                     prefix: None, | ||||
|                     namespace: namespace.clone(), | ||||
|                 }; | ||||
|                 if namespace_declarations.insert(default_namespace_declaration.clone()) { | ||||
|                     namespace_declarations_stack.push(&default_namespace_declaration); | ||||
|                     prefix = None | ||||
|                 } else { | ||||
|                     return Err(Error::DuplicateNameSpaceDeclaration(NamespaceDeclaration { | ||||
|                         prefix: None, | ||||
|                         namespace: namespace.clone(), | ||||
|                     })); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             prefix = None | ||||
|         } | ||||
|  | @ -212,7 +248,7 @@ impl<W: AsyncWrite + Unpin + Send> Writer<W> { | |||
| 
 | ||||
|         let mut attributes = Vec::new(); | ||||
| 
 | ||||
|         for namespace_declaration in &element.namespace_declarations { | ||||
|         for namespace_declaration in namespace_declarations.iter() { | ||||
|             let ns_name = namespace_declaration | ||||
|                 .prefix | ||||
|                 .as_ref() | ||||
|  | @ -265,7 +301,7 @@ impl<W: AsyncWrite + Unpin + Send> Writer<W> { | |||
| 
 | ||||
|         self.depth.push(element.name.clone()); | ||||
|         self.namespace_declarations | ||||
|             .push(element.namespace_declarations.clone()); | ||||
|             .push(namespace_declarations.clone()); | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue