use super::*;
impl<N: Network> Plaintext<N> {
pub fn find(&self, path: &[Identifier<N>]) -> Result<Plaintext<N>> {
ensure!(!path.is_empty(), "Attempted to find member with an empty path.");
match self {
Self::Literal(..) => bail!("'{self}' is not a struct"),
Self::Struct(members, ..) => {
let mut submembers = members;
let mut output = None;
for (i, identifier) in path.iter().enumerate() {
if i != path.len() - 1 {
match submembers.get(identifier) {
Some(Self::Literal(..)) => bail!("'{identifier}' must be a struct"),
Some(Self::Struct(members, ..)) => submembers = members,
None => bail!("Failed to locate member '{identifier}' in '{self}'"),
}
}
else {
match submembers.get(identifier) {
Some(plaintext) => output = Some(plaintext.clone()),
None => bail!("Failed to locate member '{identifier}' in '{self}'"),
}
}
}
match output {
Some(output) => Ok(output),
None => bail!("Failed to locate member from path in '{self}': {:?}", path),
}
}
}
}
}