2
This commit is contained in:
parent
5dcdd8510f
commit
91b6043aa5
@ -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)]
|
||||||
packages: &'a HashMap<String, String>,
|
struct PackagesWrapper<'a> {
|
||||||
}
|
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))
|
||||||
|
}
|
||||||
|
|||||||
@ -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(())
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user