Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion rust/zypp-agama/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ mod helpers;
use helpers::{status_to_result_void, string_from_ptr};

mod callbacks;
pub mod proposal;

#[derive(Debug)]
pub struct Repository {
Expand Down Expand Up @@ -200,6 +201,7 @@ pub fn load_repo_cache(alias: &str) -> ZyppResult<()> {
}
}

#[derive(Debug, Clone, Copy)]
pub enum ResolvableKind {
Package,
Pattern,
Expand Down Expand Up @@ -242,7 +244,7 @@ pub fn unselect_resolvable(name: &str, kind: ResolvableKind, who: ResolvableSele
}
}

#[derive(Debug)]
#[derive(Debug, Clone, Copy)]
pub enum ResolvableSelected {
Not,
User,
Expand Down
53 changes: 53 additions & 0 deletions rust/zypp-agama/src/proposal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
use std::collections::HashMap;


use crate::{errors::ZyppResult, select_resolvable, unselect_resolvable, ResolvableKind};

/// Captures list of required resolvables
pub struct Requirements {
/// Type of resolvable
/// If requirement needs different kinds, then define
/// more areas like bootloader_patterns, bootloader_packages
kind: ResolvableKind,
/// List of resolvables
resolvables: Vec<String>,
/// if not satisfied requirement is fatal or not
optional: bool,
}

impl Requirements {
pub fn select(&self) -> ZyppResult<()> {
for res in &self.resolvables {
select_resolvable(&res, self.kind, crate::ResolvableSelected::Installation)?;
// TODO: do not fail for missing optional package
}
Ok(())
}

pub fn unselect(&self) -> ZyppResult<()> {
for res in &self.resolvables {
unselect_resolvable(&res, self.kind, crate::ResolvableSelected::Installation)?;
// TODO: do not fail for missing optional package
}
Ok(())
}
}

/// Keeps requirements for different areas
pub struct Areas {
map: HashMap<String, Requirements>,
}

impl Areas {
/// Sets for given id requirements. It will try to satisfy requirements and also if given
/// id contain old requirements, unselects them.
pub fn set_resolvables(&mut self, id: &str, requirements: Requirements) -> ZyppResult<()> {
let key = id.to_string();
if let Some(old) = self.map.get(&key) {
old.unselect()?;
}
requirements.select()?;
self.map.insert(key, requirements);
Ok(())
}
}