diff --git a/src/engine/engine.rs b/src/engine/engine.rs index 16a9729..d029200 100644 --- a/src/engine/engine.rs +++ b/src/engine/engine.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use tokio::{sync::Mutex, task::JoinHandle}; -use crate::{config::Config, terminal::TerminalServer}; +use crate::{store::config::Config, terminal::TerminalServer}; #[derive(Debug, Clone)] pub struct Engine { diff --git a/src/engine/main.rs b/src/engine/main.rs index 2e7cd52..f4f7f64 100644 --- a/src/engine/main.rs +++ b/src/engine/main.rs @@ -1,6 +1,6 @@ -pub mod config; pub mod engine; pub mod fetch; +pub mod store; pub mod terminal; #[tokio::main] diff --git a/src/engine/store/accounts.rs b/src/engine/store/accounts.rs new file mode 100644 index 0000000..f0ef40a --- /dev/null +++ b/src/engine/store/accounts.rs @@ -0,0 +1,41 @@ +use std::collections::HashMap; + +use hypersdk::U160; + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct Account { + pub address: U160, + pub private_key: String, +} + +#[derive(Debug, Default, serde::Serialize, serde::Deserialize)] +pub struct AccountList(pub HashMap); + +impl AccountList { + pub async fn new() -> tokio::io::Result { + let path = crate::store::pulse_accounts_file()?; + + if !path.exists() { + let default = Self::default(); + + tokio::fs::create_dir_all(path.parent().unwrap()).await?; + tokio::fs::write(&path, default.to_string()?).await?; + + return Ok(default); + } + + let output = tokio::fs::read_to_string(path).await?; + + Self::from_str(&output) + } + + pub fn from_str(s: &str) -> tokio::io::Result { + toml::from_str(s) + .map_err(|v| tokio::io::Error::new(std::io::ErrorKind::InvalidInput, v.to_string())) + } + + pub fn to_string(&self) -> tokio::io::Result { + toml::to_string(self) + .map_err(|v| tokio::io::Error::new(std::io::ErrorKind::Other, v.to_string())) + } +} diff --git a/src/engine/config.rs b/src/engine/store/config.rs similarity index 67% rename from src/engine/config.rs rename to src/engine/store/config.rs index 8555d75..2ead6ae 100644 --- a/src/engine/config.rs +++ b/src/engine/store/config.rs @@ -1,19 +1,3 @@ -use std::path::PathBuf; - -pub fn home_dir() -> tokio::io::Result { - std::env::home_dir().ok_or_else(|| { - tokio::io::Error::new(std::io::ErrorKind::NotFound, "Unable to get home directory") - }) -} - -pub fn pulse_directory() -> tokio::io::Result { - Ok(home_dir()?.join(".config/pulse-trader")) -} - -pub fn pulse_config_directory() -> tokio::io::Result { - Ok(home_dir()?.join(".config/pulse-trader/config.toml")) -} - #[derive(Debug, Default, serde::Serialize, serde::Deserialize)] pub struct WatchList { pub symbols: Vec, @@ -26,7 +10,7 @@ pub struct Config { impl Config { pub async fn new() -> tokio::io::Result { - let path = pulse_config_directory()?; + let path = crate::store::pulse_config_file()?; if !path.exists() { let default = Self::default(); diff --git a/src/engine/store/mod.rs b/src/engine/store/mod.rs new file mode 100644 index 0000000..5299a77 --- /dev/null +++ b/src/engine/store/mod.rs @@ -0,0 +1,22 @@ +use std::path::PathBuf; + +pub mod accounts; +pub mod config; + +pub fn home_dir() -> tokio::io::Result { + std::env::home_dir().ok_or_else(|| { + tokio::io::Error::new(std::io::ErrorKind::NotFound, "Unable to get home directory") + }) +} + +pub fn pulse_directory() -> tokio::io::Result { + Ok(home_dir()?.join(".config").join("pulse-trader")) +} + +pub fn pulse_config_file() -> tokio::io::Result { + Ok(pulse_directory()?.join("config.toml")) +} + +pub fn pulse_accounts_file() -> tokio::io::Result { + Ok(pulse_directory()?.join("accounts.toml")) +}