1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
// use std::collections::{BTreeSet};
// use std::io::{self};
// use std::path::PathBuf;
// use colored::*;
// use crate::error::FluxError;
// use crate::file::format_manager::{FormatManager};
// use crate::file::key_collection::KeyCollection;
// //
// // Assuming `diff` is now an async function
// pub async fn diff(file1: &PathBuf, file2: &PathBuf) -> Result<(), io::Error> {
// let keys1 = match load_keys_from_file(&file1).await {
// Ok(keys) => keys,
// Err(e) => return Err(convert_flux_error_to_io_error(e)),
// };
// let keys2 = match load_keys_from_file(&file2).await {
// Ok(keys) => keys,
// Err(e) => return Err(convert_flux_error_to_io_error(e)),
// };
//
// let all_keys: BTreeSet<_> = keys1.keys().into_iter().chain(keys2.keys().into_iter()).collect();
//
// println!("{}", "Differences in environment files:".bold().underline());
//
// for key in &all_keys {
// match (keys1.get(key.as_str()), keys2.get(key.as_str())) {
// (Some(key1), Some(key2)) if key1.value() == key2.value() => {
// // Common key-value pair, no need to display.
// }
// (Some(key1), Some(key2)) => {
// let value1 = key1.value(); // Now calling .value() on &Key, not Option<&Key>
// let value2 = key2.value(); // Same here
// println!(
// "{}\n{} {}\n{} {}",
// key.cyan().bold(),
// "-".red(),
// value1.red(),
// "+".green(),
// value2.green()
// );
// }
// (Some(key1), None) => {
// let value1 = key1.value(); // Now calling .value() on &Key, not Option<&Key>
// println!(
// "{}\n{} {}\n{} {}",
// key.cyan().bold(),
// "-".red(),
// value1.red(),
// "+".green(),
// "<missing>".yellow()
// );
// }
// (None, Some(key2)) => {
// let value2 = key2.value(); // Same as above
// println!(
// "{}\n{} {}\n{} {}",
// key.cyan().bold(),
// "-".red(),
// "<missing>".yellow(),
// "+".green(),
// value2.green()
// );
// }
// (None, None) => unreachable!(),
// }
// }
//
// Ok(())
// }
//
// // Updated to be async and to use the global format manager
// async fn load_keys_from_file(file: &PathBuf) -> Result<KeyCollection, FluxError> {
// let manager = FormatManager::instance_read().await;
// manager.load_keys(&file, None)
// }
//
// fn convert_flux_error_to_io_error(error: FluxError) -> io::Error {
// io::Error::new(io::ErrorKind::Other, format!("FluxError: {:?}", error))
// }
//
// use std::collections::BTreeSet;
// use std::io::{self};
// use std::path::PathBuf;
// use colored::*;
// use cli_table::{Table, Cell, print_stdout, format::{Justify, Border}, Style};
// use crate::error::FluxError;
// use crate::file::format_manager::{FormatManager};
// use crate::file::key_collection::KeyCollection;
//
// pub async fn diff(file1: &PathBuf, file2: &PathBuf) -> Result<(), io::Error> {
// let keys1 = match load_keys_from_file(&file1).await {
// Ok(keys) => keys,
// Err(e) => return Err(convert_flux_error_to_io_error(e)),
// };
// let keys2 = match load_keys_from_file(&file2).await {
// Ok(keys) => keys,
// Err(e) => return Err(convert_flux_error_to_io_error(e)),
// };
//
// // let all_keys: BTreeSet<_> = keys1.keys().chain(keys2.keys()).collect();
// let all_keys: BTreeSet<_> = keys1.keys().into_iter().chain(keys2.keys().into_iter()).collect();
//
// let mut rows = vec![];
//
// for key in all_keys {
// let status = match (keys1.get(key.as_str()), keys2.get(key.as_str())) {
// (Some(key1), Some(key2)) => {
// if key1.value() == key2.value() {
// "✔ Present in both".green() // Same value in both files
// } else {
// "≠ Varies".yellow() // Value differs in both files
// }
// }
// (Some(_), None) => "✘ Only in file1".red(), // Present in file1, absent in file2
// (None, Some(_)) => "✘ Only in file2".red(), // Absent in file1, present in file2
// (None, None) => unreachable!(), // Unreachable because we are iterating over all keys
// };
//
// rows.push(vec![key.cyan().cell().bold(true), status.cell().bold(true)]);
// }
//
// let table = rows.table()
// .title(vec![
// "Key".cell().bold(true),
// "Status".cell().bold(true),
// ])
// .bold(true)
// .border(Border::builder().build());
//
// assert!(print_stdout(table).is_ok());
//
// Ok(())
// }
use BTreeSet;
use ;
use PathBuf;
// use cli_table::{Table, Cell, print_stdout, format::{Justify, Border}, Style};
use ;
use crateFluxError;
use crate;
use crateKeyCollection;
/// Load keys from the specified environment file.
///
/// # Arguments
/// * `file` - A reference to the `PathBuf` of the file to be loaded.
///
/// # Returns
/// Returns a `Result` containing the `KeyCollection` on success, or a `FluxError` on failure.
async
/// Converts a `FluxError` into a more generic `io::Error` to fit function signatures that expect standard IO errors.
///
/// # Arguments
/// * `error` - The `FluxError` to be converted.
///
/// # Returns
/// Returns an `io::Error` representing the original `FluxError`.
/// Compares the keys in two specified environment files and prints the differences.
///
/// # Arguments
/// * `file1` - A reference to the `PathBuf` for the first file.
/// * `file2` - A reference to the `PathBuf` for the second file.
///
/// # Returns
/// Returns an `Ok(())` if the differences were successfully calculated and printed,
/// or an `IoError` if there was a problem accessing the files or reading their contents.
pub async