11use crate :: fileflow:: enums:: database_engine:: DatabaseEngine ;
22use serde:: { Deserialize , Serialize } ;
3+ use std:: fs:: { File , OpenOptions } ;
4+ use std:: io;
5+ use std:: path:: PathBuf ;
36
47/// Struct for saving database configuration details
58#[ derive( Deserialize , Serialize , Clone ) ]
@@ -14,22 +17,59 @@ pub struct SaveConfig {
1417 pub sqlite_file_path : String ,
1518}
1619
20+ impl SaveConfig {
21+ /// This function is used to get the size of a file.
22+ pub fn get_all_configs ( config_file : & str ) -> Vec < SaveConfig > {
23+ let path: PathBuf = PathBuf :: from ( config_file) ;
24+ let file: File = match File :: open ( path) {
25+ Ok ( file) => file,
26+ Err ( _) => return Vec :: new ( ) ,
27+ } ;
28+
29+ if file. metadata ( ) . unwrap ( ) . len ( ) == 0 {
30+ return Vec :: new ( ) ;
31+ }
32+
33+ let configs: Vec < SaveConfig > = serde_json:: from_reader ( file) . unwrap_or ( Vec :: new ( ) ) ;
34+ configs
35+ }
36+
37+ /// This function is used to save a vector of SaveConfig to a json file.
38+ pub fn save_config ( configs : & [ SaveConfig ] , config_file : & str ) -> io:: Result < ( ) > {
39+ let file: File = OpenOptions :: new ( )
40+ . write ( true )
41+ . create ( true )
42+ . truncate ( true )
43+ . open ( config_file)
44+ . map_err ( |e| format ! ( "Failed to open file for writing: {e}" ) )
45+ . expect ( "Failed to open file for writing" ) ;
46+ serde_json:: to_writer_pretty ( file, & configs)
47+ . map_err ( |e| format ! ( "Failed to write to file: {e}" ) )
48+ . expect ( "Failed to write to file" ) ;
49+ Ok ( ( ) )
50+ }
51+ }
52+
1753#[ cfg( test) ]
1854mod tests {
1955 use super :: * ;
2056
21- #[ tokio:: test]
22- async fn test_save_config ( ) {
23- let config = SaveConfig {
57+ fn get_test_config ( ) -> SaveConfig {
58+ SaveConfig {
2459 config_name : "config_name" . into ( ) ,
25- db_driver : DatabaseEngine :: Postgres ,
60+ db_driver : DatabaseEngine :: SQLite ,
2661 db_host : String :: from ( "db_host" ) ,
2762 port : String :: from ( "port" ) ,
2863 username : String :: from ( "username" ) ,
2964 password : String :: from ( "password" ) ,
3065 db_name : String :: from ( "db_name" ) ,
3166 sqlite_file_path : "sqlite_file_path" . into ( ) ,
32- } ;
67+ }
68+ }
69+
70+ #[ tokio:: test]
71+ async fn test_save_config_struct ( ) {
72+ let config = get_test_config ( ) ;
3373
3474 assert_eq ! ( config. db_driver, DatabaseEngine :: Postgres ) ;
3575 assert_eq ! ( config. db_host, "db_host" ) ;
@@ -42,20 +82,11 @@ mod tests {
4282
4383 #[ tokio:: test]
4484 async fn test_save_config_serialization ( ) {
45- let config = SaveConfig {
46- config_name : "config_name" . into ( ) ,
47- db_driver : DatabaseEngine :: MySQL ,
48- db_host : String :: from ( "db_host" ) ,
49- port : String :: from ( "port" ) ,
50- username : String :: from ( "username" ) ,
51- password : String :: from ( "password" ) ,
52- db_name : String :: from ( "db_name" ) ,
53- sqlite_file_path : "sqlite_file_path" . into ( ) ,
54- } ;
85+ let config = get_test_config ( ) ;
5586
5687 let serialized = serde_json:: to_string ( & config) . unwrap ( ) ;
5788 let deserialized: SaveConfig = serde_json:: from_str ( & serialized) . unwrap ( ) ;
58-
89+
5990 assert_eq ! ( deserialized. db_driver, DatabaseEngine :: MySQL ) ;
6091 assert_eq ! ( deserialized. config_name, "config_name" ) ;
6192 assert_eq ! ( deserialized. db_host, "db_host" ) ;
@@ -65,4 +96,60 @@ mod tests {
6596 assert_eq ! ( deserialized. db_name, "db_name" ) ;
6697 assert_eq ! ( deserialized. sqlite_file_path, "sqlite_file_path" ) ;
6798 }
99+
100+ #[ tokio:: test]
101+ async fn test_get_all_saved_configs_empty ( ) {
102+ let configs = SaveConfig :: get_all_configs ( "non_existent_file.json" ) ;
103+ assert ! ( configs. is_empty( ) ) ;
104+ }
105+
106+ #[ tokio:: test]
107+ async fn test_get_all_saved_configs ( ) {
108+ let config = get_test_config ( ) ;
109+ let configs = vec ! [ config. clone( ) ] ;
110+ let config_file = "test_configs.json" ;
111+
112+ // Save the config
113+ SaveConfig :: save_config ( & configs, config_file) . unwrap ( ) ;
114+
115+ // Retrieve the config
116+ let loaded_configs = SaveConfig :: get_all_configs ( config_file) ;
117+ assert_eq ! ( loaded_configs. len( ) , 1 ) ;
118+ assert_eq ! ( loaded_configs[ 0 ] . config_name, "config_name" ) ;
119+ assert_eq ! ( loaded_configs[ 0 ] . db_driver, DatabaseEngine :: SQLite ) ;
120+ assert_eq ! ( loaded_configs[ 0 ] . db_host, "db_host" ) ;
121+ assert_eq ! ( loaded_configs[ 0 ] . port, "port" ) ;
122+ assert_eq ! ( loaded_configs[ 0 ] . username, "username" ) ;
123+ assert_eq ! ( loaded_configs[ 0 ] . password, "password" ) ;
124+ assert_eq ! ( loaded_configs[ 0 ] . db_name, "db_name" ) ;
125+ assert_eq ! ( loaded_configs[ 0 ] . sqlite_file_path, "sqlite_file_path" ) ;
126+
127+ // Clean up
128+ std:: fs:: remove_file ( config_file) . unwrap ( ) ;
129+ }
130+
131+ #[ tokio:: test]
132+ async fn test_save_config ( ) {
133+ let config = get_test_config ( ) ;
134+ let configs = vec ! [ config. clone( ) ] ;
135+ let config_file = "test_save_configs.json" ;
136+
137+ // Save the config
138+ SaveConfig :: save_config ( & configs, config_file) . unwrap ( ) ;
139+
140+ // Retrieve the config
141+ let loaded_configs = SaveConfig :: get_all_configs ( config_file) ;
142+ assert_eq ! ( loaded_configs. len( ) , 1 ) ;
143+ assert_eq ! ( loaded_configs[ 0 ] . config_name, "config_name" ) ;
144+ assert_eq ! ( loaded_configs[ 0 ] . db_driver, DatabaseEngine :: SQLite ) ;
145+ assert_eq ! ( loaded_configs[ 0 ] . db_host, "db_host" ) ;
146+ assert_eq ! ( loaded_configs[ 0 ] . port, "port" ) ;
147+ assert_eq ! ( loaded_configs[ 0 ] . username, "username" ) ;
148+ assert_eq ! ( loaded_configs[ 0 ] . password, "password" ) ;
149+ assert_eq ! ( loaded_configs[ 0 ] . db_name, "db_name" ) ;
150+ assert_eq ! ( loaded_configs[ 0 ] . sqlite_file_path, "sqlite_file_path" ) ;
151+
152+ // Clean up
153+ std:: fs:: remove_file ( config_file) . unwrap ( ) ;
154+ }
68155}
0 commit comments