added macro for const and main inputs sections

This commit is contained in:
damirka 2021-03-18 11:57:25 +03:00
parent 0eb7b972c7
commit 2b6f39fd14
6 changed files with 85 additions and 123 deletions

View File

@ -18,7 +18,7 @@
macro_rules! input_section_impl { macro_rules! input_section_impl {
($($name: ident), *) => ($( ($($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)] #[derive(Clone, PartialEq, Eq, Default)]
pub struct $name { pub struct $name {
is_present: bool, is_present: bool,
@ -63,10 +63,66 @@ macro_rules! input_section_impl {
Ok(()) Ok(())
} }
/// Returns this section's [IndexMap] of values /// Returns this section's [IndexMap] of values.
pub fn values(&self) -> IndexMap<Parameter, Option<InputValue>> { pub fn values(&self) -> IndexMap<Parameter, Option<InputValue>> {
self.values.clone() 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<String, Option<InputValue>>,
}
#[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<InputValue>) {
self.input.insert(key, value);
}
/// Parses main input definitions and stores them in `self`.
pub fn parse(&mut self, definitions: Vec<Definition>) -> 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<Option<InputValue>> {
self.input.get(name).cloned()
}
}
)*)
}

View File

@ -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 <https://www.gnu.org/licenses/>.
use crate::InputValue;
use leo_input::{definitions::Definition, InputParserError};
use indexmap::IndexMap;
#[derive(Clone, PartialEq, Eq, Default)]
pub struct ConstInput {
input: IndexMap<String, Option<InputValue>>,
}
#[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<InputValue>) {
self.input.insert(key, value);
}
/// Parses constant input definitions and stores them in `self`.
pub fn parse(&mut self, definitions: Vec<Definition>) -> 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<Option<InputValue>> {
self.input.get(name).cloned()
}
}

View File

@ -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 <https://www.gnu.org/licenses/>.
use crate::InputValue;
use leo_input::{definitions::Definition, InputParserError};
use indexmap::IndexMap;
main_input_definitions!(ConstantInput);

View File

@ -19,51 +19,4 @@ use leo_input::{definitions::Definition, InputParserError};
use indexmap::IndexMap; use indexmap::IndexMap;
#[derive(Clone, PartialEq, Eq, Default)] main_input_definitions!(MainInput);
pub struct MainInput {
input: IndexMap<String, Option<InputValue>>,
}
#[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<InputValue>) {
self.input.insert(key, value);
}
/// Parses main input definitions and stores them in `self`.
pub fn parse(&mut self, definitions: Vec<Definition>) -> 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<Option<InputValue>> {
self.input.get(name).cloned()
}
}

View File

@ -16,8 +16,8 @@
#![allow(clippy::module_inception)] #![allow(clippy::module_inception)]
pub mod const_input; pub mod constant_input;
pub use const_input::*; pub use constant_input::*;
pub mod main_input; pub mod main_input;
pub use main_input::*; pub use main_input::*;

View File

@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>. // along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
use crate::{ConstInput, InputValue, MainInput, Registers}; use crate::{ConstantInput, InputValue, MainInput, Registers};
use leo_input::{ use leo_input::{
sections::{Header, Section}, sections::{Header, Section},
InputParserError, InputParserError,
@ -23,7 +23,7 @@ use leo_input::{
#[derive(Clone, PartialEq, Eq, Default)] #[derive(Clone, PartialEq, Eq, Default)]
pub struct ProgramInput { pub struct ProgramInput {
pub main: MainInput, pub main: MainInput,
pub constants: ConstInput, pub constants: ConstantInput,
registers: Registers, registers: Registers,
} }