tenebrous-dicebot/src/bin/dicebot.rs

91 lines
2.3 KiB
Rust
Raw Normal View History

//Needed for nested Result handling from tokio. Probably can go away after 1.47.0.
#![type_length_limit = "7605144"]
use actix::prelude::*;
use chronicle_dicebot::bot::DiceBot;
use chronicle_dicebot::config::*;
use chronicle_dicebot::error::BotError;
use chronicle_dicebot::state::DiceBotState;
2020-08-28 00:13:01 +00:00
use env_logger::Env;
use log::error;
use std::fs;
use std::path::PathBuf;
use std::sync::Arc;
fn read_config<P: Into<PathBuf>>(config_path: P) -> Result<Config, BotError> {
let config_path = config_path.into();
let config = {
let contents = fs::read_to_string(&config_path)?;
deserialize_config(&contents)?
};
Ok(config)
}
2020-04-17 05:20:54 +00:00
fn deserialize_config(contents: &str) -> Result<Config, BotError> {
let config = toml::from_str(&contents)?;
Ok(config)
}
#[actix_rt::main]
async fn main() {
match run().await {
Ok(_) => (),
Err(e) => error!("Error: {:?}", e),
};
}
async fn run() -> Result<(), BotError> {
2020-08-28 00:13:01 +00:00
env_logger::from_env(Env::default().default_filter_or("chronicle_dicebot=info")).init();
2020-04-17 22:53:27 +00:00
let config_path = std::env::args()
2020-04-17 05:25:13 +00:00
.skip(1)
.next()
2020-04-17 22:53:27 +00:00
.expect("Need a config as an argument");
2020-04-17 05:20:54 +00:00
let cfg = Arc::new(read_config(config_path)?);
let bot_state = DiceBotState::new(&cfg).start();
match DiceBot::new(&cfg, bot_state) {
Ok(bot) => bot.run().await?,
Err(e) => println!("Error connecting: {:?}", e),
};
2020-04-17 05:20:54 +00:00
System::current().stop();
Ok(())
2020-04-17 05:20:54 +00:00
}
#[cfg(test)]
mod tests {
use super::*;
use indoc::indoc;
#[test]
fn deserialize_config_without_bot_section_test() {
let contents = indoc! {"
[matrix]
home_server = 'https://matrix.example.com'
username = 'username'
password = 'password'
"};
let cfg: Result<_, _> = deserialize_config(contents);
assert_eq!(true, cfg.is_ok());
}
#[test]
fn deserialize_config_without_oldest_message_setting_test() {
let contents = indoc! {"
[matrix]
home_server = 'https://matrix.example.com'
username = 'username'
password = 'password'
[bot]
not_a_real_setting = 2
"};
let cfg: Result<_, _> = deserialize_config(contents);
assert_eq!(true, cfg.is_ok());
}
}