This commit is contained in:
shibazaki 2025-10-06 15:14:28 +02:00
parent 5dcdd8510f
commit 91b6043aa5
2 changed files with 27 additions and 15 deletions

View File

@ -1,4 +1,9 @@
use std::fs;
use crate::structs::Package; use crate::structs::Package;
use std::error::Error;
use serde::Serialize;
use std::collections::HashMap;
use std::process::Command;
fn parse_dpkg_output(output: &str) -> Vec<Package> { fn parse_dpkg_output(output: &str) -> Vec<Package> {
output output
@ -12,25 +17,29 @@ fn parse_dpkg_output(output: &str) -> Vec<Package> {
.collect() .collect()
} }
use std::collections::HashMap;
fn packages_to_hashmap(packages: &[Package]) -> HashMap<String, String> { fn packages_to_hashmap(packages: &[Package]) -> HashMap<String, String> {
packages.iter().map(|p| (p.name.clone(), p.version.clone())).collect() packages.iter().map(|p| (p.name.clone(), p.version.clone())).collect()
} }
#[derive(serde::Serialize)] pub fn save_packages_to_toml(packages: &[Package], path: &str) -> Result<(), Box<dyn Error>> {
struct PackagesWrapper<'a> { #[derive(Serialize)]
struct PackagesWrapper<'a> {
packages: &'a HashMap<String, String>, packages: &'a HashMap<String, String>,
} }
use std::fs; let pkg_map = packages_to_hashmap(packages);
use std::error::Error; let wrapper = PackagesWrapper { packages: &pkg_map };
use serde::Serialize;
/// Save any serializable struct or collection into a TOML file. let toml_string = toml::to_string_pretty(&wrapper)?;
pub fn save_to_toml<T: Serialize>(data: &T, path: &str) -> Result<(), Box<dyn Error>> {
let toml_string = toml::to_string_pretty(data)?;
fs::write(path, toml_string)?; fs::write(path, toml_string)?;
Ok(()) Ok(())
} }
pub fn get_installed_packages() -> Result<Vec<Package>, Box<dyn std::error::Error>> {
let output = Command::new("dpkg-query")
.args(&["-W"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
Ok(parse_dpkg_output(&stdout))
}

View File

@ -2,15 +2,18 @@ mod structs;
mod loaders; mod loaders;
use crate::loaders::sources::{load_sources, save_sources_to_toml}; use crate::loaders::sources::{load_sources, save_sources_to_toml};
use crate::loaders::packages::{get_installed_packages, save_packages_to_toml};
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
// Sources
let sources = load_sources("/etc/apt/sources.list")?; let sources = load_sources("/etc/apt/sources.list")?;
save_sources_to_toml(&sources, "sources.toml")?; save_sources_to_toml(&sources, "sources.toml")?;
println!("Saved sources to sources.toml"); println!("Saved sources to sources.toml");
let pkg_map = packages_to_hashmap(&packages); // Packages
let wrapper = PackagesWrapper { packages: &pkg_map }; let packages = get_installed_packages()?;
save_to_toml(&wrapper, "packages.toml")?; save_packages_to_toml(&packages, "packages.toml")?;
println!("Saved packages to packages.toml");
Ok(()) Ok(())
} }