use super::*;
impl<A: Aleo> Plaintext<A> {
pub fn find(&self, path: &[Identifier<A>]) -> Result<Plaintext<A>> {
if path.is_empty() {
A::halt("Attempted to find member with an empty path.")
}
match self {
Self::Literal(..) => A::halt("Literal 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 struct"),
}
}
else {
match submembers.get(identifier) {
Some(plaintext) => output = Some(plaintext.clone()),
None => bail!("Failed to locate member '{identifier}' in struct"),
}
}
}
match output {
Some(output) => Ok(output),
None => A::halt("Failed to locate member in struct from path"),
}
}
}
}
}