#![allow(clippy::pedantic)]
#![warn(missing_docs)]
#![doc = include_str!("../README.md")]
#[macro_use]
mod request;
pub mod methods;
pub mod responses;
pub mod user;
pub use crate::{responses::*, user::*};
use chrono::prelude::*;
use reqwest::Client;
use serde::Deserialize;
use std::fmt;
#[derive(Clone, Debug, Deserialize)]
pub struct CCashSessionProperties {
pub version: u32,
pub max_log: u32,
pub return_on_del: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct TransactionLog {
pub to: String,
pub from: String,
pub amount: u32,
pub time: i64,
}
impl fmt::Display for TransactionLog {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}: {} ({} CSH) -> {}",
DateTime::<Utc>::from_utc(NaiveDateTime::from_timestamp(self.time, 0), Utc),
&self.from,
self.amount,
&self.to,
)
}
}
#[doc = include_str!("../examples/get_balance.rs")]
#[derive(Debug, Clone)]
pub struct CCashSession {
session_url: String,
is_connected: bool,
client: Option<Client>,
properties: Option<CCashSessionProperties>,
}
impl CCashSession {
pub fn new(base_url: &str) -> CCashSession {
Self {
session_url: format!("{}/api", base_url),
is_connected: false,
client: None,
properties: None,
}
}
pub async fn establish_connection(&mut self) -> Result<(), CCashError> {
if self.is_connected {
return Ok(());
}
let client = Client::builder().build()?;
let request = client
.get(format!("{}/properties", self.session_url))
.header("Accept", "application/json")
.build()?;
let response = client.execute(request).await?;
if let Ok(v) = response.json::<CCashSessionProperties>().await {
self.properties = Some(v.clone());
self.session_url = format!("{}/v{}", self.session_url, v.version);
self.is_connected = true;
self.client = Some(client);
Ok(())
} else {
Err(CCashError::CouldNotParsePropertiesResponse)
}
}
pub fn get_client(&self) -> &Option<Client> { &self.client }
pub fn is_connected(&self) -> bool { self.is_connected }
pub fn get_properties(&self) -> &Option<CCashSessionProperties> { &self.properties }
}