From 5be80214fc1d33efba1b18dd6277988fd3c2c14d Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 6 Aug 2026 07:42:08 +0200 Subject: [PATCH] Better stuff --- Cargo.toml | 7 +++++- src/account.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++ src/executor/mod.rs | 19 +++++++++------ src/main.rs | 1 + 4 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 src/account.rs diff --git a/Cargo.toml b/Cargo.toml index 2033f49..2bcf258 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,12 @@ futures-util = "0.3.33" serde = { version = "1.0.229", features = ["derive", "serde_derive"] } serde_json = "1.0.151" -tokio = { version = "1.53.1", features = ["macros", "rt-multi-thread", "sync"] } +tokio = { version = "1.53.1", features = [ + "macros", + "rt-multi-thread", + "sync", + "fs", +] } tokio-tungstenite = { version = "0.30.0", features = ["native-tls"] } log = "0.4.33" env_logger = "0.11.11" diff --git a/src/account.rs b/src/account.rs new file mode 100644 index 0000000..e3bb4c9 --- /dev/null +++ b/src/account.rs @@ -0,0 +1,56 @@ +use std::{collections::HashMap, path::PathBuf}; + +use crate::executor::pump_fun::PumpDevAccount; +use anyhow::{Context, anyhow}; +use serde::{Deserialize, Serialize}; + +pub fn get_accounts_path() -> anyhow::Result { + Ok(std::env::home_dir() + .context("Failed to get home dir")? + .join(".config") + .join("sol-hunter") + .join("accounts.json")) +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum Account { + PumpDev(PumpDevAccount), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AccountManger { + pub active: String, + pub accounts: HashMap, +} + +impl AccountManger { + pub async fn get() -> anyhow::Result { + let path = get_accounts_path()?; + + if !path.exists() { + let default = Self::new().await?; + + 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 async fn new() -> anyhow::Result { + Err(anyhow!("Not implemented yet")) + } + + pub fn from_str(s: &str) -> anyhow::Result { + serde_json::from_str(s).context("Failed to parse accounts") + } + + pub fn to_string(&self) -> anyhow::Result { + serde_json::to_string(self).context("Failed to serialize accounts") + } +} diff --git a/src/executor/mod.rs b/src/executor/mod.rs index 91be45f..90bb138 100644 --- a/src/executor/mod.rs +++ b/src/executor/mod.rs @@ -1,15 +1,10 @@ pub mod pump_fun; use rust_decimal::Decimal; -use serde::{Deserialize, Serialize}; +use tokio::sync::Mutex; -use crate::executor::pump_fun::PumpDevAccount; +use crate::account::Account; -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(tag = "type")] -pub enum Account { - PumpDev(PumpDevAccount), -} #[allow(async_fn_in_trait, unused_variables)] pub trait Executor { @@ -33,3 +28,13 @@ pub trait Executor { Ok(()) } } + +impl Account { + pub fn executor(self) -> impl Executor { + match self { + Self::PumpDev(account) => pump_fun::PumpDev { + account: Mutex::new(account), + }, + } + } +} diff --git a/src/main.rs b/src/main.rs index 06c53ac..b17ea58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +pub mod account; pub mod executor; pub mod types;