use crate::security::tag::AuthenticationTag;
use crate::types::Symbol;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AuthenticatedSymbol {
symbol: Symbol,
tag: AuthenticationTag,
verified: bool,
}
impl AuthenticatedSymbol {
#[must_use]
pub fn new_verified(symbol: Symbol, tag: AuthenticationTag) -> Self {
Self {
symbol,
tag,
verified: true,
}
}
#[must_use]
pub fn from_parts(symbol: Symbol, tag: AuthenticationTag) -> Self {
Self {
symbol,
tag,
verified: false,
}
}
#[must_use]
#[inline]
pub fn symbol(&self) -> &Symbol {
&self.symbol
}
#[must_use]
#[inline]
pub fn tag(&self) -> &AuthenticationTag {
&self.tag
}
#[must_use]
#[inline]
pub fn is_verified(&self) -> bool {
self.verified
}
pub(crate) fn set_verified(&mut self, verified: bool) {
self.verified = verified;
}
#[must_use]
pub fn into_symbol(self) -> Symbol {
self.symbol
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{SymbolId, SymbolKind};
#[test]
fn test_new_verified() {
let id = SymbolId::new_for_test(1, 0, 0);
let symbol = Symbol::new(id, vec![], SymbolKind::Source);
let tag = AuthenticationTag::zero();
let auth = AuthenticatedSymbol::new_verified(symbol.clone(), tag);
assert!(auth.is_verified());
assert_eq!(auth.symbol(), &symbol);
assert_eq!(auth.tag(), &tag);
}
#[test]
fn test_from_parts_unverified() {
let id = SymbolId::new_for_test(1, 0, 0);
let symbol = Symbol::new(id, vec![], SymbolKind::Source);
let tag = AuthenticationTag::zero();
let auth = AuthenticatedSymbol::from_parts(symbol, tag);
assert!(!auth.is_verified());
}
#[test]
fn test_into_symbol() {
let id = SymbolId::new_for_test(1, 0, 0);
let symbol = Symbol::new(id, vec![1, 2], SymbolKind::Source);
let tag = AuthenticationTag::zero();
let auth = AuthenticatedSymbol::new_verified(symbol.clone(), tag);
let unwrapped = auth.into_symbol();
assert_eq!(unwrapped, symbol);
}
#[test]
fn authenticated_symbol_debug_clone_eq() {
let id = SymbolId::new_for_test(1, 0, 0);
let symbol = Symbol::new(id, vec![1, 2, 3], SymbolKind::Source);
let tag = AuthenticationTag::zero();
let auth = AuthenticatedSymbol::new_verified(symbol, tag);
let dbg = format!("{auth:?}");
assert!(dbg.contains("AuthenticatedSymbol"), "{dbg}");
let cloned = auth.clone();
assert_eq!(auth, cloned);
}
#[test]
fn set_verified_updates_flag() {
let id = SymbolId::new_for_test(1, 0, 0);
let symbol = Symbol::new(id, vec![1, 2, 3], SymbolKind::Source);
let tag = AuthenticationTag::zero();
let mut auth = AuthenticatedSymbol::new_verified(symbol, tag);
auth.set_verified(false);
assert!(!auth.is_verified());
auth.set_verified(true);
assert!(auth.is_verified());
}
}