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}