use crate::models::LineNumber;
#[derive(Debug, Clone, PartialEq)]
pub struct CopyrightDetection {
pub copyright: String,
pub start_line: LineNumber,
pub end_line: LineNumber,
}
#[derive(Debug, Clone, PartialEq)]
pub struct HolderDetection {
pub holder: String,
pub start_line: LineNumber,
pub end_line: LineNumber,
}
#[derive(Debug, Clone, PartialEq)]
pub struct AuthorDetection {
pub author: String,
pub start_line: LineNumber,
pub end_line: LineNumber,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PosTag {
Copy, SpdxContrib,
Yr, YrPlus, BareYr,
Nnp, Nn, Caps, Pn, MixedCap,
Comp, Uni,
Auth, Auth2, Auths, AuthDot, Maint, Contributors, Commit,
Right, Reserved,
Cc, Of, By, In, Van, To, Dash,
Email, EmailStart, EmailEnd, Url, Url2, Holder, Is, Held, Notice, Portions, Oth, Following, Mit, Linux, Parens, At, Dot, Ou,
EmptyLine, Junk,
Cd, Cds, Month, Day, }
#[derive(Debug, Clone)]
pub struct Token {
pub value: String,
pub tag: PosTag,
pub start_line: LineNumber,
}
#[derive(Debug, Clone)]
pub enum ParseNode {
Leaf(Token),
Tree {
label: TreeLabel,
children: Vec<ParseNode>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TreeLabel {
YrRange,
YrAnd,
AllRightReserved,
Name,
NameEmail,
NameYear,
NameCopy,
NameCaps,
Company,
AndCo,
Copyright,
Copyright2,
Author,
AndAuth,
InitialDev,
DashCaps,
}
impl ParseNode {
pub fn tag(&self) -> Option<PosTag> {
match self {
ParseNode::Leaf(token) => Some(token.tag),
ParseNode::Tree { .. } => None,
}
}
pub fn label(&self) -> Option<TreeLabel> {
match self {
ParseNode::Tree { label, .. } => Some(*label),
ParseNode::Leaf(_) => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_copyright_detection_creation() {
let d = CopyrightDetection {
copyright: "Copyright 2024 Acme Inc.".to_string(),
start_line: LineNumber::ONE,
end_line: LineNumber::ONE,
};
assert_eq!(d.copyright, "Copyright 2024 Acme Inc.");
}
#[test]
fn test_token_creation() {
let t = Token {
value: "Copyright".to_string(),
tag: PosTag::Copy,
start_line: LineNumber::ONE,
};
assert_eq!(t.tag, PosTag::Copy);
}
#[test]
fn test_parse_node_leaf() {
let node = ParseNode::Leaf(Token {
value: "2024".to_string(),
tag: PosTag::Yr,
start_line: LineNumber::new(5).unwrap(),
});
assert_eq!(node.tag(), Some(PosTag::Yr));
assert_eq!(node.label(), None);
}
#[test]
fn test_parse_node_tree() {
let child = ParseNode::Leaf(Token {
value: "2024".to_string(),
tag: PosTag::Yr,
start_line: LineNumber::new(3).unwrap(),
});
let tree = ParseNode::Tree {
label: TreeLabel::YrRange,
children: vec![child],
};
assert_eq!(tree.label(), Some(TreeLabel::YrRange));
assert_eq!(tree.tag(), None);
}
}