From d28f1d0032bb2c4e46ee22eca9a3be52f01c37fa Mon Sep 17 00:00:00 2001 From: shibazaki Date: Fri, 3 Oct 2025 21:14:20 +0200 Subject: [PATCH] test --- src/loaders/mod.rs | 3 +++ src/loaders/sources.rs | 59 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 13 ++++++++-- src/structs.rs | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/loaders/mod.rs b/src/loaders/mod.rs index e69de29..029602e 100644 --- a/src/loaders/mod.rs +++ b/src/loaders/mod.rs @@ -0,0 +1,3 @@ +pub mod packages; +pub mod pin; +pub mod sources; diff --git a/src/loaders/sources.rs b/src/loaders/sources.rs index e69de29..486fe2d 100644 --- a/src/loaders/sources.rs +++ b/src/loaders/sources.rs @@ -0,0 +1,59 @@ +use std::fs::File; +use std::io::{self, BufRead}; +use std::path::Path; + +use crate::structs::{AptSource, RepoType}; + +/// Loads Debian APT sources from a given file path (e.g., "/etc/apt/sources.list") +pub fn load_sources(path: &str) -> io::Result> { + let file = File::open(Path::new(path))?; + let reader = io::BufReader::new(file); + + let mut sources = Vec::new(); + let mut counter = 1; + + for line in reader.lines() { + let line = line?; + let trimmed = line.trim(); + + // Skip empty lines and comments + if trimmed.is_empty() || trimmed.starts_with('#') { + continue; + } + + let parts: Vec<&str> = trimmed.split_whitespace().collect(); + if parts.len() < 3 { + eprintln!("Skipping malformed line: {}", trimmed); + continue; + } + + // Determine repository type + let repo_type = match parts[0] { + "deb" => RepoType::Bin, + "deb-src" => RepoType::Src, + other => { + eprintln!("Unknown repo type: {}", other); + continue; + } + }; + + // parts[1] = URI + // parts[2] = distribution (bookworm, trixie, etc.) + // parts[3..] = components + let uri = parts[1].to_string(); + let debian_version = parts[2].to_string(); + let components = parts[3..].iter().map(|s| s.to_string()).collect(); + + sources.push(AptSource { + name: Some(format!("repo{}", counter)), + bin_repo: repo_type, + uri, + debian_version, + components, + }); + + counter += 1; + } + + Ok(sources) +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..8919045 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,12 @@ -fn main() { - println!("Hello, world!"); +mod loaders; +mod structs; + +use crate::loaders::sources::load_sources; + +fn main() -> std::io::Result<()> { + let sources = load_sources("/etc/apt/sources.list")?; + for source in sources { + println!("{:?}", source); + } + Ok(()) } diff --git a/src/structs.rs b/src/structs.rs index 3df2add..911e590 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -8,6 +8,7 @@ pub struct System { pub arch: String, } +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum RepoType { Bin, // deb Src, // deb-src