ochat_common/
lib.rs

1use base64_stream::ToBase64Reader;
2use image::ImageFormat;
3use ochat_types::user::Token;
4use serde::de::DeserializeOwned;
5use std::{
6    env,
7    error::Error,
8    fs::{self, File},
9    io::{BufReader, Cursor, Read},
10    path::Path,
11};
12
13pub mod data;
14
15const TOKEN_PATH: &str = "jwt.json";
16
17pub fn save_token(token: &Token) {
18    let path = get_path_settings(TOKEN_PATH.to_string());
19    let writer = File::create(path);
20
21    if let Ok(writer) = writer {
22        let _ = serde_json::to_writer_pretty(writer, &token);
23    }
24}
25
26pub fn load_token() -> Result<Token, String> {
27    let path = get_path_settings(TOKEN_PATH.to_string());
28    load_from_file(&path)
29}
30
31pub fn print_param_count(params: &u64) -> String {
32    if params <= &0 {
33        return String::from("Unknown");
34    }
35    match params.ilog10() {
36        0..3 => format!("{}", params),
37        3..6 => format!("{}K", params / 1000),
38        6..9 => format!("{}M", params / 1_000_000),
39        9..12 => format!("{}G", params / 1_000_000_000),
40        _ => format!("{}T", params / 1_000_000_000_000),
41    }
42}
43
44pub fn print_data_size(size: &u64) -> String {
45    if size <= &0 {
46        return String::from("Unknown");
47    }
48    match size.ilog10() {
49        0..3 => format!("{} B", size),
50        3..6 => format!("{} KB", size / 1000),
51        6..9 => format!("{} MB", size / 1_000_000),
52        9..12 => format!("{} GB", size / 1_000_000_000),
53        _ => format!("{} TB", size / 1_000_000_000_000),
54    }
55}
56pub fn load_from_file<T: DeserializeOwned>(path: &str) -> Result<T, String> {
57    let reader = File::open(path);
58
59    if let Ok(mut reader) = reader {
60        let mut data = String::new();
61        let _ = reader
62            .read_to_string(&mut data)
63            .map_err(|e| e.to_string())?;
64
65        let de_data = serde_json::from_str(&data);
66
67        return match de_data {
68            Ok(x) => Ok(x),
69            Err(e) => Err(e.to_string()),
70        };
71    }
72
73    Err("Failed to open file".to_string())
74}
75
76pub fn get_path_settings(path: String) -> String {
77    let mut new_path = env::var("XDG_CONFIG_HOME")
78        .or_else(|_| env::var("HOME"))
79        .unwrap();
80    new_path.push_str(&format!("/.config/ochat"));
81
82    if !fs::exists(&new_path).unwrap_or(true) {
83        fs::create_dir(&new_path).unwrap();
84    }
85
86    new_path.push_str(&format!("/{}", path));
87    new_path
88}
89
90pub fn get_path_local(path: String) -> String {
91    let mut new_path = env::var("XDG_CONFIG_HOME")
92        .or_else(|_| env::var("HOME"))
93        .unwrap();
94    new_path.push_str(&format!("/.local/share/ochat"));
95
96    if !fs::exists(&new_path).unwrap_or(true) {
97        fs::create_dir(&new_path).unwrap();
98    }
99
100    new_path.push_str(&format!("/{}", path));
101    new_path
102}
103
104pub fn get_path_dir(path: String) -> String {
105    let mut new_path = env!("CARGO_MANIFEST_DIR").to_string();
106    new_path.push_str(&format!("/{}", path));
107    new_path
108}
109
110pub fn convert_image_to_b64(path: &Path) -> Result<String, Box<dyn Error>> {
111    let f = BufReader::new(File::open(path)?);
112
113    let format = ImageFormat::from_path(path)?;
114    if !matches!(format, ImageFormat::Png | ImageFormat::Jpeg) {
115        let img = image::load(f, format)?;
116        let mut buf = Vec::new();
117        img.write_to(&mut Cursor::new(&mut buf), ImageFormat::Png)?;
118        let mut reader = ToBase64Reader::new(buf.as_slice());
119        let mut base64 = String::new();
120        reader.read_to_string(&mut base64)?;
121        return Ok(base64);
122    }
123
124    let mut reader = ToBase64Reader::new(f);
125    let mut base64 = String::new();
126    reader.read_to_string(&mut base64)?;
127
128    Ok(base64)
129}
130
131pub fn convert_file_to_b64(path: &Path) -> Result<String, Box<dyn Error>> {
132    let mut file = File::open(path)?;
133    let mut buffer = Vec::new();
134    file.read_to_end(&mut buffer)?;
135    let mut reader = ToBase64Reader::new(buffer.as_slice());
136    let mut base64 = String::new();
137    reader.read_to_string(&mut base64)?;
138    Ok(base64)
139}
140
141pub fn convert_audio_to_b64(path: &Path) -> Result<String, Box<dyn Error>> {
142    convert_file_to_b64(path)
143}