Skip to content

Commit

Permalink
refactor config helper function
Browse files Browse the repository at this point in the history
  • Loading branch information
PhantomMorrigan committed Jun 29, 2023
1 parent 1f90b4e commit e2907ed
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 41 deletions.
73 changes: 33 additions & 40 deletions src/config_parser/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,46 +24,35 @@ pub struct Config {
pub binding_ip_addr: String,
pub style: Style,
pub redis_connection_url: String,
pub aggregator: AggreatorConfig,
pub aggregator: AggregatorConfig,
pub logging: bool,
pub debug: bool,
}

/// Configuration options for the aggregator.
#[derive(Clone)]
pub struct AggreatorConfig {
pub struct AggregatorConfig {
/// Whether to introduce a random delay before sending the request to the search engine.
pub random_delay: bool,
}

impl Config {
/// A function which parses the config.lua file and puts all the parsed options in the newly
/// contructed Config struct and returns it.
/// constructed Config struct and returns it.
///
/// # Error
///
/// Returns a lua parse error if parsing of the config.lua file fails or has a syntax error
/// or io error if the config.lua file doesn't exists otherwise it returns a newly contructed
/// or io error if the config.lua file doesn't exists otherwise it returns a newly constructed
/// Config struct with all the parsed config options from the parsed config file.
pub fn parse() -> Result<Self, Box<dyn std::error::Error>> {
Lua::new().context(|context| -> Result<Self, Box<dyn std::error::Error>> {
let globals = context.globals();

context
.load(&fs::read_to_string(
Config::handle_different_config_file_path()?,
)?)
.load(&fs::read_to_string(Config::get_config_path()?)?)
.exec()?;

let production_use = globals.get::<_, bool>("production_use")?;
let aggregator_config = if production_use {
AggreatorConfig { random_delay: true }
} else {
AggreatorConfig {
random_delay: false,
}
};

Ok(Config {
port: globals.get::<_, u16>("port")?,
binding_ip_addr: globals.get::<_, String>("binding_ip_addr")?,
Expand All @@ -72,7 +61,9 @@ impl Config {
globals.get::<_, String>("colorscheme")?,
),
redis_connection_url: globals.get::<_, String>("redis_connection_url")?,
aggregator: aggregator_config,
aggregator: AggregatorConfig {
random_delay: globals.get::<_, bool>("production_use")?,
},
logging: globals.get::<_, bool>("logging")?,
debug: globals.get::<_, bool>("debug")?,
})
Expand All @@ -90,35 +81,37 @@ impl Config {
/// one (3).
/// 3. `websurfx/` (under project folder ( or codebase in other words)) if it is not present
/// here then it returns an error as mentioned above.
fn handle_different_config_file_path() -> Result<String, Box<dyn std::error::Error>> {
if Path::new(
format!(
"{}/.config/{}/config.lua",
std::env::var("HOME").unwrap(),
COMMON_DIRECTORY_NAME
)
.as_str(),
)
.exists()
{
Ok(format!(
fn get_config_path() -> Result<String, Box<dyn std::error::Error>> {
// check user config

let path = format!(
"{}/.config/{}/config.lua",
std::env::var("HOME").unwrap(),
COMMON_DIRECTORY_NAME
);
if Path::new(path.as_str()).exists() {
return Ok(format!(
"{}/.config/{}/{}",
std::env::var("HOME").unwrap(),
COMMON_DIRECTORY_NAME,
CONFIG_FILE_NAME
))
} else if Path::new(
format!("/etc/xdg/{}/{}", COMMON_DIRECTORY_NAME, CONFIG_FILE_NAME).as_str(),
)
.exists()
{
Ok("/etc/xdg/websurfx/config.lua".to_string())
} else if Path::new(format!("./{}/{}", COMMON_DIRECTORY_NAME, CONFIG_FILE_NAME).as_str())
));
}

// look for config in /etc/xdg
if Path::new(format!("/etc/xdg/{}/{}", COMMON_DIRECTORY_NAME, CONFIG_FILE_NAME).as_str())
.exists()
{
Ok("./websurfx/config.lua".to_string())
} else {
Err("Config file not found!!".to_string().into())
return Ok("/etc/xdg/websurfx/config.lua".to_string());
}

// use dev config
if Path::new(format!("./{}/{}", COMMON_DIRECTORY_NAME, CONFIG_FILE_NAME).as_str()).exists()
{
return Ok("./websurfx/config.lua".to_string());
}

// if no of the configs above exist, return error
Err("Config file not found!!".to_string().into())
}
}
2 changes: 1 addition & 1 deletion src/config_parser/parser_models.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//! This module provides public models for handling, storing and serializing parsed config file
//! options from config.lua by grouping them togather.
//! options from config.lua by grouping them together.
use serde::{Deserialize, Serialize};

Expand Down

0 comments on commit e2907ed

Please sign in to comment.