From 91b6043aa5971b61931097fc8a1410cac4831872 Mon Sep 17 00:00:00 2001 From: shibazaki Date: Mon, 6 Oct 2025 15:14:28 +0200 Subject: [PATCH] 2 --- src/loaders/packages.rs | 33 +++++++++++++++++++++------------ src/main.rs | 9 ++++++--- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/loaders/packages.rs b/src/loaders/packages.rs index 17fa98f..02f58bc 100644 --- a/src/loaders/packages.rs +++ b/src/loaders/packages.rs @@ -1,4 +1,9 @@ +use std::fs; 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 { output @@ -12,25 +17,29 @@ fn parse_dpkg_output(output: &str) -> Vec { .collect() } -use std::collections::HashMap; - fn packages_to_hashmap(packages: &[Package]) -> HashMap { packages.iter().map(|p| (p.name.clone(), p.version.clone())).collect() } -#[derive(serde::Serialize)] -struct PackagesWrapper<'a> { - packages: &'a HashMap, -} +pub fn save_packages_to_toml(packages: &[Package], path: &str) -> Result<(), Box> { + #[derive(Serialize)] + struct PackagesWrapper<'a> { + packages: &'a HashMap, + } -use std::fs; -use std::error::Error; -use serde::Serialize; + let pkg_map = packages_to_hashmap(packages); + let wrapper = PackagesWrapper { packages: &pkg_map }; -/// Save any serializable struct or collection into a TOML file. -pub fn save_to_toml(data: &T, path: &str) -> Result<(), Box> { - let toml_string = toml::to_string_pretty(data)?; + let toml_string = toml::to_string_pretty(&wrapper)?; fs::write(path, toml_string)?; + Ok(()) } +pub fn get_installed_packages() -> Result, Box> { + let output = Command::new("dpkg-query") + .args(&["-W"]) + .output()?; + let stdout = String::from_utf8(output.stdout)?; + Ok(parse_dpkg_output(&stdout)) +} diff --git a/src/main.rs b/src/main.rs index 5365054..7f1bc9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,15 +2,18 @@ mod structs; mod loaders; 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> { + // Sources let sources = load_sources("/etc/apt/sources.list")?; save_sources_to_toml(&sources, "sources.toml")?; println!("Saved sources to sources.toml"); - let pkg_map = packages_to_hashmap(&packages); - let wrapper = PackagesWrapper { packages: &pkg_map }; - save_to_toml(&wrapper, "packages.toml")?; + // Packages + let packages = get_installed_packages()?; + save_packages_to_toml(&packages, "packages.toml")?; + println!("Saved packages to packages.toml"); Ok(()) }