1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::{errors::ExpressionError, program::ConstrainedProgram, value::ConstrainedValue, GroupType};
use leo_asg::{CircuitAccessExpression, Node};
use snarkvm_models::{
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
#[allow(clippy::too_many_arguments)]
pub fn enforce_circuit_access<CS: ConstraintSystem<F>>(
&mut self,
cs: &mut CS,
expr: &CircuitAccessExpression,
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
if let Some(target) = &expr.target {
let target_value = self.enforce_expression(cs, target)?;
match target_value {
ConstrainedValue::CircuitExpression(def, members) => {
assert!(def.circuit == expr.circuit);
if let Some(member) = members.into_iter().find(|x| x.0.name == expr.member.name) {
Ok(member.1)
} else {
Err(ExpressionError::undefined_member_access(
expr.circuit.name.borrow().to_string(),
expr.member.to_string(),
expr.member.span.clone(),
))
}
}
value => Err(ExpressionError::undefined_circuit(
value.to_string(),
target.span().cloned().unwrap_or_default(),
)),
}
} else {
Err(ExpressionError::invalid_static_access(
expr.member.to_string(),
expr.member.span.clone(),
))
}
}
}