Share one Namespace type between gen and macro
diff --git a/syntax/mod.rs b/syntax/mod.rs
index 4eaf81e..21ff447 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -7,6 +7,7 @@
pub mod error;
pub mod ident;
mod impls;
+pub mod namespace;
mod parse;
pub mod set;
mod tokens;
diff --git a/syntax/namespace.rs b/syntax/namespace.rs
new file mode 100644
index 0000000..557e331
--- /dev/null
+++ b/syntax/namespace.rs
@@ -0,0 +1,35 @@
+use std::fmt::{self, Display};
+use std::slice::Iter;
+
+#[derive(Clone)]
+pub struct Namespace {
+ segments: Vec<String>,
+}
+
+impl Namespace {
+ pub fn new(segments: Vec<String>) -> Self {
+ Namespace { segments }
+ }
+
+ pub fn iter(&self) -> Iter<String> {
+ self.segments.iter()
+ }
+}
+
+impl Display for Namespace {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ for segment in self {
+ f.write_str(segment)?;
+ f.write_str("$")?;
+ }
+ Ok(())
+ }
+}
+
+impl<'a> IntoIterator for &'a Namespace {
+ type Item = &'a String;
+ type IntoIter = Iter<'a, String>;
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}