use std::hash::{Hash, Hasher};
#[derive(Clone, Debug)]
pub struct RelName {
key: String,
spelled: String,
dot: usize,
}
impl RelName {
pub fn new(schema: &str, name: &str) -> Result<Self, String> {
let key = gnitz_wire::qualified_key(
&gnitz_wire::canonical_identifier(schema)?,
&gnitz_wire::canonical_identifier(name)?,
);
Ok(RelName {
key,
spelled: gnitz_wire::qualified_key(schema, name),
dot: schema.len(),
})
}
pub fn parse(default_schema: &str, text: &str) -> Result<Self, String> {
let (schema, name) = text.split_once('.').unwrap_or((default_schema, text));
Self::new(schema, name)
}
pub fn schema(&self) -> &str {
&self.key[..self.dot]
}
pub fn name(&self) -> &str {
&self.key[self.dot + 1..]
}
pub fn key(&self) -> &str {
&self.key
}
pub fn spelled_name(&self) -> &str {
&self.spelled[self.dot + 1..]
}
pub fn sibling(&self, name: &str) -> Result<Self, String> {
Self::new(&self.spelled[..self.dot], name)
}
}
impl PartialEq for RelName {
fn eq(&self, other: &Self) -> bool {
self.key == other.key
}
}
impl Eq for RelName {}
impl Hash for RelName {
fn hash<H: Hasher>(&self, state: &mut H) {
self.key.hash(state);
}
}
impl std::fmt::Display for RelName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.spelled)
}
}
#[cfg(test)]
#[path = "tests/rel_name.rs"]
mod tests;