Params: add rust structs
This commit is contained in:
parent
ac00b506b6
commit
560423b742
3 changed files with 171 additions and 5 deletions
|
@ -8,4 +8,5 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "4.4.8", features = ["derive"]}
|
clap = { version = "4.4.8", features = ["derive"]}
|
||||||
derive_builder = "0.12.0"
|
derive_builder = "0.12.0"
|
||||||
|
serde = { version = "1.0.192", features = ["derive"]}
|
||||||
toml = "0.8.8"
|
toml = "0.8.8"
|
||||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -2,7 +2,13 @@ use std::fs;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate derive_builder;
|
||||||
|
|
||||||
mod ast;
|
mod ast;
|
||||||
|
mod params;
|
||||||
|
|
||||||
|
use params::Params;
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[command(author, version, about, long_about = None)]
|
#[command(author, version, about, long_about = None)]
|
||||||
|
@ -12,10 +18,7 @@ struct Args {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
let params_toml = fs::read_to_string(&args.config)
|
let params_toml = Params::parse(&args.config);
|
||||||
.expect("Failed to read parameters file into string")
|
|
||||||
.parse::<toml::Table>()
|
|
||||||
.expect("Failed to parse TOML from parameters file");
|
|
||||||
|
|
||||||
println!("{}", params_toml["global_flow"]["gen_decl"]);
|
println!("{}", params_toml.global_flow.gen_decl);
|
||||||
}
|
}
|
||||||
|
|
162
src/params.rs
Normal file
162
src/params.rs
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
use std::fs;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
// Makes all these structs public and deserializable
|
||||||
|
macro_rules! toml_struct {
|
||||||
|
(struct $name:ident {$($field:ident: $t:ty,)*}) => {
|
||||||
|
#[derive(Deserialize, Clone)]
|
||||||
|
pub struct $name {
|
||||||
|
$(pub $field: $t),*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct Params {
|
||||||
|
global_flow: GlobalFlow,
|
||||||
|
statements: Statments,
|
||||||
|
types: Types,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GlobalFlow {
|
||||||
|
gen_decl: f64,
|
||||||
|
gen_subroutine: f64,
|
||||||
|
gen_typedef: f64,
|
||||||
|
end_generation: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct Statments {
|
||||||
|
gen_assign: GenAssign,
|
||||||
|
gen_decl: GenDecl,
|
||||||
|
gen_global_decl: GenGlobalDecl,
|
||||||
|
gen_if_statement: GenIfStatement,
|
||||||
|
gen_loop: GenLoop,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenAssign {
|
||||||
|
gen_boolean: f64,
|
||||||
|
gen_character: f64,
|
||||||
|
gen_integer: f64,
|
||||||
|
gen_real: f64,
|
||||||
|
gen_tuple: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenDecl {
|
||||||
|
gen_boolean: f64,
|
||||||
|
gen_character: f64,
|
||||||
|
gen_integer: f64,
|
||||||
|
gen_real: f64,
|
||||||
|
gen_tuple: f64,
|
||||||
|
qual_const: f64,
|
||||||
|
qual_var: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenGlobalDecl {
|
||||||
|
gen_boolean: f64,
|
||||||
|
gen_character: f64,
|
||||||
|
gen_integer: f64,
|
||||||
|
gen_real: f64,
|
||||||
|
gen_tuple: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenIfStatement {
|
||||||
|
gen_statement: f64,
|
||||||
|
end_gen_statement: f64,
|
||||||
|
fork_elif: f64,
|
||||||
|
fork_else: f64,
|
||||||
|
fork_end: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenLoop {
|
||||||
|
gen_inf_loop: f64,
|
||||||
|
gen_cond_loop: f64,
|
||||||
|
gen_statement: f64,
|
||||||
|
end_gen_statement: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct Types {
|
||||||
|
gen_boolean: GenBoolean,
|
||||||
|
gen_integer: GenInteger,
|
||||||
|
gen_real: GenReal,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenBoolean {
|
||||||
|
expr_and: f64,
|
||||||
|
expr_or: f64,
|
||||||
|
expr_not: f64,
|
||||||
|
expr_gt: f64,
|
||||||
|
expr_ge: f64,
|
||||||
|
expr_lt: f64,
|
||||||
|
expr_le: f64,
|
||||||
|
expr_eq: f64,
|
||||||
|
expr_eq_real: f64,
|
||||||
|
expr_eq_char: f64,
|
||||||
|
expr_eq_tuple: f64,
|
||||||
|
expr_ne: f64,
|
||||||
|
expr_ne_real: f64,
|
||||||
|
expr_ne_char: f64,
|
||||||
|
expr_ne_tuple: f64,
|
||||||
|
get_instant: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenInteger {
|
||||||
|
expr_add: f64,
|
||||||
|
expr_sub: f64,
|
||||||
|
expr_mul: f64,
|
||||||
|
expr_div: f64,
|
||||||
|
expr_rem: f64,
|
||||||
|
expr_exp: f64,
|
||||||
|
expr_pos: f64,
|
||||||
|
expr_neg: f64,
|
||||||
|
get_instant: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_struct!{
|
||||||
|
struct GenReal {
|
||||||
|
expr_add: f64,
|
||||||
|
expr_sub: f64,
|
||||||
|
expr_mul: f64,
|
||||||
|
expr_div: f64,
|
||||||
|
expr_rem: f64,
|
||||||
|
expr_exp: f64,
|
||||||
|
expr_pos: f64,
|
||||||
|
expr_neg: f64,
|
||||||
|
gen_integer: f64,
|
||||||
|
get_instant: f64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Params {
|
||||||
|
pub fn parse(p: &PathBuf) -> Self {
|
||||||
|
let file_string = fs::read_to_string(p)
|
||||||
|
.expect("Failed to read parameters file into string");
|
||||||
|
|
||||||
|
let params: Params = toml::from_str(&file_string)
|
||||||
|
.expect("Failed to parse TOML from parameters file");
|
||||||
|
|
||||||
|
params
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue