use std::{error::Error, fs::read_to_string, io}; use toml::{Table, Value}; pub struct ZoneConnectionData { pub conection_str: String, pub key_name: String, pub key: String, } pub struct ServerZonesConnection { pub root_domain: String, pub servers_data: Vec, } impl ZoneConnectionData { pub fn get_config(file_name: &String) -> Result, Box> { let mut ret = Vec::new(); let key_toml = read_to_string(file_name)?.parse::()?; for servers in key_toml["server"] .as_array() .ok_or(generate_toml_parser_error_in_field("server"))? { let conection_str: String = servers["connection_str"] .as_str() .ok_or(generate_toml_parser_error_in_field("connection_str"))? .to_string(); let key_name: String = servers["key"]["name"] .as_str() .ok_or(generate_toml_parser_error_in_field("key name"))? .to_string(); let key: String = servers["key"]["value"] .as_str() .ok_or(generate_toml_parser_error_in_field("key value"))? .to_string(); ret.push(Self { conection_str, key_name, key, }); } Ok(ret) } } impl ServerZonesConnection { pub fn get_config(file_name: &String) -> Result> { let root_domain: String = read_to_string(file_name)?.parse::
()?["zone"]["root_domain"] .as_str() .ok_or(generate_toml_parser_error_in_field("zone root_domain"))? .to_string(); Ok(Self { root_domain, servers_data: ZoneConnectionData::get_config(file_name)?, }) } } fn generate_toml_parser_error_in_field(field: &str) -> io::Error { io::Error::new( io::ErrorKind::InvalidData, format!("Invalid format for config.toml in {} field", field), ) }