node: return full tracking policy

Instead of returning tuples for `repo_entry` and `node_entry`, return
the `Repo` and `Node` types, respectively.

Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
This commit is contained in:
Fintan Halpenny 2023-03-06 11:53:45 +00:00
parent b82584617b
commit 546b402467
No known key found for this signature in database
GPG Key ID: 2552FB6F64066CB7
2 changed files with 52 additions and 32 deletions

View File

@ -15,7 +15,6 @@ pub use store::Error;
pub struct Config { pub struct Config {
/// Default policy, if a policy for a specific node or repository was not found. /// Default policy, if a policy for a specific node or repository was not found.
policy: Policy, policy: Policy,
#[allow(dead_code)]
/// Default scope, if a scope for a specific repository was not found. /// Default scope, if a scope for a specific repository was not found.
scope: Scope, scope: Scope,
/// Underlying configuration store. /// Underlying configuration store.
@ -34,30 +33,34 @@ impl Config {
/// Check if a repository is tracked. /// Check if a repository is tracked.
pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> { pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> {
self.repo_policy(id).map(|entry| entry == Policy::Track) self.repo_policy(id)
.map(|entry| entry.policy == Policy::Track)
} }
/// Check if a node is tracked. /// Check if a node is tracked.
pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> { pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> {
self.node_policy(id).map(|entry| entry == Policy::Track) self.node_policy(id)
.map(|entry| entry.policy == Policy::Track)
} }
/// Get a node's tracking information. /// Get a node's tracking information.
/// Returns the default policy if the node isn't found. /// Returns the default policy if the node isn't found.
pub fn node_policy(&self, id: &NodeId) -> Result<Policy, Error> { pub fn node_policy(&self, id: &NodeId) -> Result<Node, Error> {
if let Some((_, policy)) = self.store.node_entry(id)? { Ok(self.store.node_entry(id)?.unwrap_or(Node {
return Ok(policy); id: *id,
} alias: None,
Ok(self.policy) policy: self.policy,
}))
} }
/// Get a repository's tracking information. /// Get a repository's tracking information.
/// Returns the default policy if the repo isn't found. /// Returns the default policy if the repo isn't found.
pub fn repo_policy(&self, id: &Id) -> Result<Policy, Error> { pub fn repo_policy(&self, id: &Id) -> Result<Repo, Error> {
if let Some((_, policy)) = self.store.repo_entry(id)? { Ok(self.store.repo_entry(id)?.unwrap_or(Repo {
return Ok(policy); id: *id,
} scope: self.scope,
Ok(self.policy) policy: self.policy,
}))
} }
} }

View File

@ -8,7 +8,7 @@ use thiserror::Error;
use crate::prelude::Id; use crate::prelude::Id;
use crate::service::NodeId; use crate::service::NodeId;
use super::{Alias, Node, Policy, Repo, Scope}; use super::{Node, Policy, Repo, Scope};
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
@ -141,16 +141,28 @@ impl Config {
/// Check if a node is tracked. /// Check if a node is tracked.
pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> { pub fn is_node_tracked(&self, id: &NodeId) -> Result<bool, Error> {
Ok(matches!(self.node_entry(id)?, Some((_, Policy::Track)))) Ok(matches!(
self.node_entry(id)?,
Some(Node {
policy: Policy::Track,
..
})
))
} }
/// Check if a repository is tracked. /// Check if a repository is tracked.
pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> { pub fn is_repo_tracked(&self, id: &Id) -> Result<bool, Error> {
Ok(matches!(self.repo_entry(id)?, Some((_, Policy::Track)))) Ok(matches!(
self.repo_entry(id)?,
Some(Repo {
policy: Policy::Track,
..
})
))
} }
/// Get a node's tracking information. /// Get a node's tracking information.
pub fn node_entry(&self, id: &NodeId) -> Result<Option<(Option<Alias>, Policy)>, Error> { pub fn node_entry(&self, id: &NodeId) -> Result<Option<Node>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT alias, policy FROM `node-policies` WHERE id = ?")?; .prepare("SELECT alias, policy FROM `node-policies` WHERE id = ?")?;
@ -162,13 +174,17 @@ impl Config {
let alias = alias.is_empty().not().then_some(alias.to_owned()); let alias = alias.is_empty().not().then_some(alias.to_owned());
let policy = row.read::<Policy, _>("policy"); let policy = row.read::<Policy, _>("policy");
return Ok(Some((alias, policy))); return Ok(Some(Node {
id: *id,
alias,
policy,
}));
} }
Ok(None) Ok(None)
} }
/// Get a repository's tracking information. /// Get a repository's tracking information.
pub fn repo_entry(&self, id: &Id) -> Result<Option<(Scope, Policy)>, Error> { pub fn repo_entry(&self, id: &Id) -> Result<Option<Repo>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT scope, policy FROM `repo-policies` WHERE id = ?")?; .prepare("SELECT scope, policy FROM `repo-policies` WHERE id = ?")?;
@ -176,10 +192,11 @@ impl Config {
stmt.bind((1, id))?; stmt.bind((1, id))?;
if let Some(Ok(row)) = stmt.into_iter().next() { if let Some(Ok(row)) = stmt.into_iter().next() {
return Ok(Some(( return Ok(Some(Repo {
row.read::<Scope, _>("scope"), id: *id,
row.read::<Policy, _>("policy"), scope: row.read::<Scope, _>("scope"),
))); policy: row.read::<Policy, _>("policy"),
}));
} }
Ok(None) Ok(None)
} }
@ -289,15 +306,15 @@ mod test {
assert!(db.track_node(&id, Some("eve")).unwrap()); assert!(db.track_node(&id, Some("eve")).unwrap());
assert_eq!( assert_eq!(
db.node_entry(&id).unwrap().unwrap().0, db.node_entry(&id).unwrap().unwrap().alias,
Some(String::from("eve")) Some(String::from("eve"))
); );
assert!(db.track_node(&id, None).unwrap()); assert!(db.track_node(&id, None).unwrap());
assert_eq!(db.node_entry(&id).unwrap().unwrap().0, None); assert_eq!(db.node_entry(&id).unwrap().unwrap().alias, None);
assert!(!db.track_node(&id, None).unwrap()); assert!(!db.track_node(&id, None).unwrap());
assert!(db.track_node(&id, Some("alice")).unwrap()); assert!(db.track_node(&id, Some("alice")).unwrap());
assert_eq!( assert_eq!(
db.node_entry(&id).unwrap().unwrap().0, db.node_entry(&id).unwrap().unwrap().alias,
Some(String::from("alice")) Some(String::from("alice"))
); );
} }
@ -308,9 +325,9 @@ mod test {
let mut db = Config::open(":memory:").unwrap(); let mut db = Config::open(":memory:").unwrap();
assert!(db.track_repo(&id, Scope::All).unwrap()); assert!(db.track_repo(&id, Scope::All).unwrap());
assert_eq!(db.repo_entry(&id).unwrap().unwrap().0, Scope::All); assert_eq!(db.repo_entry(&id).unwrap().unwrap().scope, Scope::All);
assert!(db.track_repo(&id, Scope::Trusted).unwrap()); assert!(db.track_repo(&id, Scope::Trusted).unwrap());
assert_eq!(db.repo_entry(&id).unwrap().unwrap().0, Scope::Trusted); assert_eq!(db.repo_entry(&id).unwrap().unwrap().scope, Scope::Trusted);
} }
#[test] #[test]
@ -319,9 +336,9 @@ mod test {
let mut db = Config::open(":memory:").unwrap(); let mut db = Config::open(":memory:").unwrap();
assert!(db.track_repo(&id, Scope::All).unwrap()); assert!(db.track_repo(&id, Scope::All).unwrap());
assert_eq!(db.repo_entry(&id).unwrap().unwrap().1, Policy::Track); assert_eq!(db.repo_entry(&id).unwrap().unwrap().policy, Policy::Track);
assert!(db.set_repo_policy(&id, Policy::Block).unwrap()); assert!(db.set_repo_policy(&id, Policy::Block).unwrap());
assert_eq!(db.repo_entry(&id).unwrap().unwrap().1, Policy::Block); assert_eq!(db.repo_entry(&id).unwrap().unwrap().policy, Policy::Block);
} }
#[test] #[test]
@ -330,8 +347,8 @@ mod test {
let mut db = Config::open(":memory:").unwrap(); let mut db = Config::open(":memory:").unwrap();
assert!(db.track_node(&id, None).unwrap()); assert!(db.track_node(&id, None).unwrap());
assert_eq!(db.node_entry(&id).unwrap().unwrap().1, Policy::Track); assert_eq!(db.node_entry(&id).unwrap().unwrap().policy, Policy::Track);
assert!(db.set_node_policy(&id, Policy::Block).unwrap()); assert!(db.set_node_policy(&id, Policy::Block).unwrap());
assert_eq!(db.node_entry(&id).unwrap().unwrap().1, Policy::Block); assert_eq!(db.node_entry(&id).unwrap().unwrap().policy, Policy::Block);
} }
} }