find.rs
1 // Copyright (c) 2025-2026 ACDC Network 2 // This file is part of the alphavm library. 3 // 4 // Alpha Chain | Delta Chain Protocol 5 // International Monetary Graphite. 6 // 7 // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com). 8 // They built world-class ZK infrastructure. We installed the EASY button. 9 // Their cryptography: elegant. Our modifications: bureaucracy-compatible. 10 // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours. 11 // 12 // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0 13 // All modifications and new work: CC0 1.0 Universal Public Domain Dedication. 14 // No rights reserved. No permission required. No warranty. No refunds. 15 // 16 // https://creativecommons.org/publicdomain/zero/1.0/ 17 // SPDX-License-Identifier: CC0-1.0 18 19 use super::*; 20 21 impl<N: Network> Record<N, Plaintext<N>> { 22 /// Returns the entry from the given path. 23 pub fn find<A: Into<Access<N>> + Copy + Debug>(&self, path: &[A]) -> Result<Entry<N, Plaintext<N>>> { 24 // If the path is of length one, check if the path is requesting the `owner`. 25 if path.len() == 1 && path[0].into() == Access::Member(Identifier::from_str("owner")?) { 26 return Ok(self.owner.to_entry()); 27 } 28 29 // Ensure the path is not empty. 30 if let Some((first, rest)) = path.split_first() { 31 let first = match (*first).into() { 32 Access::Member(identifier) => identifier, 33 Access::Index(_) => bail!("Attempted to index into a record"), 34 }; 35 // Retrieve the top-level entry. 36 match self.data.get(&first) { 37 Some(entry) => match rest.is_empty() { 38 // If the remaining path is empty, return the top-level entry. 39 true => Ok(entry.clone()), 40 // Otherwise, recursively call `find` on the top-level entry. 41 false => entry.find(rest), 42 }, 43 None => bail!("Record entry `{first}` not found."), 44 } 45 } else { 46 bail!("Attempted to find record entry with an empty path.") 47 } 48 } 49 }