From 2b6f39fd1429cf94b3b5bca3c8ca09c2e6c331d2 Mon Sep 17 00:00:00 2001 From: damirka Date: Thu, 18 Mar 2021 11:57:25 +0300 Subject: [PATCH] added macro for const and main inputs sections --- ast/src/input/macros.rs | 60 +++++++++++++++- ast/src/input/program_input/const_input.rs | 69 ------------------- ast/src/input/program_input/constant_input.rs | 22 ++++++ ast/src/input/program_input/main_input.rs | 49 +------------ ast/src/input/program_input/mod.rs | 4 +- ast/src/input/program_input/program_input.rs | 4 +- 6 files changed, 85 insertions(+), 123 deletions(-) delete mode 100644 ast/src/input/program_input/const_input.rs create mode 100644 ast/src/input/program_input/constant_input.rs diff --git a/ast/src/input/macros.rs b/ast/src/input/macros.rs index d77655ecae..d5ae5e8cda 100644 --- a/ast/src/input/macros.rs +++ b/ast/src/input/macros.rs @@ -18,7 +18,7 @@ macro_rules! input_section_impl { ($($name: ident), *) => ($( - /// An input section declared in an input file with `[$name]` + /// An input section declared in an input file with `[$name]`. #[derive(Clone, PartialEq, Eq, Default)] pub struct $name { is_present: bool, @@ -63,10 +63,66 @@ macro_rules! input_section_impl { Ok(()) } - /// Returns this section's [IndexMap] of values + /// Returns this section's [IndexMap] of values. pub fn values(&self) -> IndexMap> { self.values.clone() } } )*) } + +#[macro_export] +macro_rules! main_input_definitions { + ($($name: ident), *) => ($( + + /// `[$name]` program input section. + #[derive(Clone, PartialEq, Eq, Default)] + pub struct $name { + input: IndexMap>, + } + + #[allow(clippy::len_without_is_empty)] + impl $name { + pub fn new() -> Self { + Self::default() + } + + /// Returns an empty version of this struct with `None` values. + /// Called during constraint synthesis to provide private input variables. + pub fn empty(&self) -> Self { + let mut input = self.input.clone(); + + input.iter_mut().for_each(|(_name, value)| { + *value = None; + }); + + Self { input } + } + + pub fn len(&self) -> usize { + self.input.len() + } + + pub fn insert(&mut self, key: String, value: Option) { + self.input.insert(key, value); + } + + /// Parses main input definitions and stores them in `self`. + pub fn parse(&mut self, definitions: Vec) -> Result<(), InputParserError> { + for definition in definitions { + let name = definition.parameter.variable.value; + let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?; + + self.insert(name, Some(value)); + } + + Ok(()) + } + + /// Returns an `Option` of the main function input at `name`. + pub fn get(&self, name: &str) -> Option> { + self.input.get(name).cloned() + } + } + )*) +} diff --git a/ast/src/input/program_input/const_input.rs b/ast/src/input/program_input/const_input.rs deleted file mode 100644 index 0421b2a28e..0000000000 --- a/ast/src/input/program_input/const_input.rs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. -// This file is part of the Leo library. - -// The Leo library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The Leo library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the Leo library. If not, see . - -use crate::InputValue; -use leo_input::{definitions::Definition, InputParserError}; - -use indexmap::IndexMap; - -#[derive(Clone, PartialEq, Eq, Default)] -pub struct ConstInput { - input: IndexMap>, -} - -#[allow(clippy::len_without_is_empty)] -impl ConstInput { - pub fn new() -> Self { - Self::default() - } - - /// Returns an empty version of this struct with `None` values. - /// Called during constraint synthesis to provide private input variables. - pub fn empty(&self) -> Self { - let mut input = self.input.clone(); - - input.iter_mut().for_each(|(_name, value)| { - *value = None; - }); - - Self { input } - } - - pub fn len(&self) -> usize { - self.input.len() - } - - pub fn insert(&mut self, key: String, value: Option) { - self.input.insert(key, value); - } - - /// Parses constant input definitions and stores them in `self`. - pub fn parse(&mut self, definitions: Vec) -> Result<(), InputParserError> { - for definition in definitions { - let name = definition.parameter.variable.value; - let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?; - - self.insert(name, Some(value)); - } - - Ok(()) - } - - /// Returns an `Option` of the constant main function input at `name`. - pub fn get(&self, name: &str) -> Option> { - self.input.get(name).cloned() - } -} diff --git a/ast/src/input/program_input/constant_input.rs b/ast/src/input/program_input/constant_input.rs new file mode 100644 index 0000000000..af11fe0110 --- /dev/null +++ b/ast/src/input/program_input/constant_input.rs @@ -0,0 +1,22 @@ +// Copyright (C) 2019-2021 Aleo Systems Inc. +// This file is part of the Leo library. + +// The Leo library is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// The Leo library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with the Leo library. If not, see . + +use crate::InputValue; +use leo_input::{definitions::Definition, InputParserError}; + +use indexmap::IndexMap; + +main_input_definitions!(ConstantInput); diff --git a/ast/src/input/program_input/main_input.rs b/ast/src/input/program_input/main_input.rs index 94326e63f1..0905ab4b3b 100644 --- a/ast/src/input/program_input/main_input.rs +++ b/ast/src/input/program_input/main_input.rs @@ -19,51 +19,4 @@ use leo_input::{definitions::Definition, InputParserError}; use indexmap::IndexMap; -#[derive(Clone, PartialEq, Eq, Default)] -pub struct MainInput { - input: IndexMap>, -} - -#[allow(clippy::len_without_is_empty)] -impl MainInput { - pub fn new() -> Self { - Self::default() - } - - /// Returns an empty version of this struct with `None` values. - /// Called during constraint synthesis to provide private input variables. - pub fn empty(&self) -> Self { - let mut input = self.input.clone(); - - input.iter_mut().for_each(|(_name, value)| { - *value = None; - }); - - Self { input } - } - - pub fn len(&self) -> usize { - self.input.len() - } - - pub fn insert(&mut self, key: String, value: Option) { - self.input.insert(key, value); - } - - /// Parses main input definitions and stores them in `self`. - pub fn parse(&mut self, definitions: Vec) -> Result<(), InputParserError> { - for definition in definitions { - let name = definition.parameter.variable.value; - let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?; - - self.insert(name, Some(value)); - } - - Ok(()) - } - - /// Returns an `Option` of the main function input at `name`. - pub fn get(&self, name: &str) -> Option> { - self.input.get(name).cloned() - } -} +main_input_definitions!(MainInput); diff --git a/ast/src/input/program_input/mod.rs b/ast/src/input/program_input/mod.rs index 9245144b3b..89005a1d0a 100644 --- a/ast/src/input/program_input/mod.rs +++ b/ast/src/input/program_input/mod.rs @@ -16,8 +16,8 @@ #![allow(clippy::module_inception)] -pub mod const_input; -pub use const_input::*; +pub mod constant_input; +pub use constant_input::*; pub mod main_input; pub use main_input::*; diff --git a/ast/src/input/program_input/program_input.rs b/ast/src/input/program_input/program_input.rs index 6938817e61..a2c99f2570 100644 --- a/ast/src/input/program_input/program_input.rs +++ b/ast/src/input/program_input/program_input.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with the Leo library. If not, see . -use crate::{ConstInput, InputValue, MainInput, Registers}; +use crate::{ConstantInput, InputValue, MainInput, Registers}; use leo_input::{ sections::{Header, Section}, InputParserError, @@ -23,7 +23,7 @@ use leo_input::{ #[derive(Clone, PartialEq, Eq, Default)] pub struct ProgramInput { pub main: MainInput, - pub constants: ConstInput, + pub constants: ConstantInput, registers: Registers, }