Params: add rust structs

This commit is contained in:
Akemi Izuko 2023-11-16 14:59:51 -07:00
parent ac00b506b6
commit 560423b742
Signed by: akemi
GPG key ID: 8DE0764E1809E9FC
3 changed files with 171 additions and 5 deletions

View file

@ -8,4 +8,5 @@ edition = "2021"
[dependencies]
clap = { version = "4.4.8", features = ["derive"]}
derive_builder = "0.12.0"
serde = { version = "1.0.192", features = ["derive"]}
toml = "0.8.8"

View file

@ -2,7 +2,13 @@ use std::fs;
use std::path::PathBuf;
use clap::Parser;
#[macro_use]
extern crate derive_builder;
mod ast;
mod params;
use params::Params;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
@ -12,10 +18,7 @@ struct Args {
fn main() {
let args = Args::parse();
let params_toml = fs::read_to_string(&args.config)
.expect("Failed to read parameters file into string")
.parse::<toml::Table>()
.expect("Failed to parse TOML from parameters file");
let params_toml = Params::parse(&args.config);
println!("{}", params_toml["global_flow"]["gen_decl"]);
println!("{}", params_toml.global_flow.gen_decl);
}

162
src/params.rs Normal file
View 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
}
}