1use crate::{Expression, IntegerType, Literal, LiteralVariant, Type};
18use snarkvm::console::program::ArrayType as ConsoleArrayType;
19
20use leo_span::{Span, Symbol};
21use serde::{Deserialize, Serialize};
22use snarkvm::prelude::Network;
23use std::fmt;
24
25#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
27pub struct ArrayType {
28 pub element_type: Box<Type>,
29 pub length: Box<Expression>,
30}
31
32impl ArrayType {
33 pub fn new(element: Type, length: Expression) -> Self {
35 Self { element_type: Box::new(element), length: Box::new(length) }
36 }
37
38 pub fn element_type(&self) -> &Type {
40 &self.element_type
41 }
42
43 pub fn base_element_type(&self) -> &Type {
45 match self.element_type.as_ref() {
46 Type::Array(array_type) => array_type.base_element_type(),
47 type_ => type_,
48 }
49 }
50
51 pub fn from_snarkvm<N: Network>(array_type: &ConsoleArrayType<N>, program: Option<Symbol>) -> Self {
52 Self {
53 element_type: Box::new(Type::from_snarkvm(array_type.next_element_type(), program)),
54 length: Box::new(Expression::Literal(Literal {
55 variant: LiteralVariant::Integer(IntegerType::U32, array_type.length().to_string().replace("u32", "")),
56 id: Default::default(),
57 span: Span::default(),
58 })),
59 }
60 }
61}
62
63impl fmt::Display for ArrayType {
64 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65 if let Expression::Literal(literal) = &*self.length {
67 if let LiteralVariant::Integer(_, s) = &literal.variant {
68 return write!(f, "[{}; {s}]", self.element_type);
69 }
70 }
71
72 write!(f, "[{}; {}]", self.element_type, self.length)
73 }
74}