lingora_core/audit/
result.rs1use std::collections::HashMap;
2
3use fluent4rs::ast::Entry;
4
5use crate::{
6 audit::{AuditIssue, Workspace},
7 domain::{HasLocale, Locale},
8 fluent::{FluentDocument, QualifiedIdentifier},
9};
10
11#[derive(Clone, Copy, Debug)]
13pub enum DocumentRole {
14 Canonical,
16
17 Primary,
19
20 Variant,
22
23 Orphan,
25}
26
27#[derive(Clone, Debug)]
29pub struct AuditedDocument {
30 document: FluentDocument,
31 role: DocumentRole,
32}
33
34impl AuditedDocument {
35 pub fn from_fluent_document(role: DocumentRole, document: &FluentDocument) -> Self {
37 let document = document.clone();
38 Self { document, role }
39 }
40
41 pub fn role(&self) -> DocumentRole {
43 self.role
44 }
45
46 pub fn identifiers(&self) -> impl Iterator<Item = QualifiedIdentifier> {
48 self.document.entry_identifiers()
49 }
50
51 pub fn entries(&self, identifier: &QualifiedIdentifier) -> impl Iterator<Item = &Entry> {
53 self.document.entries(identifier)
54 }
55}
56
57impl HasLocale for AuditedDocument {
58 fn locale(&self) -> &Locale {
59 self.document.locale()
60 }
61}
62
63#[derive(Debug)]
72pub struct AuditResult {
73 issues: Vec<AuditIssue>,
74 documents: HashMap<Locale, AuditedDocument>,
75 workspace: Workspace,
76}
77
78impl AuditResult {
79 pub(crate) fn new(
80 issues: Vec<AuditIssue>,
81 nodes: Vec<AuditedDocument>,
82 workspace: &Workspace,
83 ) -> Self {
84 let documents = nodes
85 .iter()
86 .cloned()
87 .map(|node| (node.locale().clone(), node))
88 .collect::<HashMap<_, _>>();
89 let workspace = workspace.clone();
90
91 Self {
92 issues,
93 documents,
94 workspace,
95 }
96 }
97
98 pub fn is_ok(&self) -> bool {
100 self.issues.is_empty()
101 }
102
103 pub fn workspace(&self) -> &Workspace {
105 &self.workspace
106 }
107
108 pub fn issues(&self) -> impl Iterator<Item = &AuditIssue> {
110 self.issues.iter()
111 }
112
113 pub fn canonical_locale(&self) -> &Locale {
115 self.workspace.canonical_locale()
116 }
117
118 pub fn document_locales(&self) -> impl Iterator<Item = &Locale> {
120 self.documents.keys()
121 }
122
123 pub fn document(&self, locale: &Locale) -> Option<&AuditedDocument> {
125 self.documents.get(locale)
126 }
127}