From 37966baa5c7447ef4e9683a19f196fc04d943b23 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 10:11:25 +0700 Subject: [PATCH 01/16] feat: add diagnostic hints and suggestions system Adds rich diagnostic capabilities inspired by compiler diagnostics: - Hint: contextual advice explaining errors - Suggestion: actionable fixes with optional commands - DocLink: documentation URLs - DiagnosticVisibility: dev/staging/prod filtering - Colored output in Local mode - Zero-cost when unused (Option>) --- src/app_error.rs | 4 +- src/app_error/core/builder.rs | 193 ++++++++++++- src/app_error/core/display.rs | 121 +++++++- src/app_error/core/error.rs | 12 +- src/app_error/diagnostics.rs | 509 ++++++++++++++++++++++++++++++++++ src/app_error/inline_vec.rs | 6 +- src/colored.rs | 146 +++++++++- src/lib.rs | 11 +- 8 files changed, 990 insertions(+), 12 deletions(-) create mode 100644 src/app_error/diagnostics.rs diff --git a/src/app_error.rs b/src/app_error.rs index fffd18a..87e20f6 100644 --- a/src/app_error.rs +++ b/src/app_error.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -69,6 +69,7 @@ mod constructors; mod context; mod core; +pub mod diagnostics; mod inline_vec; mod metadata; @@ -77,6 +78,7 @@ pub use core::{AppError, AppResult, DisplayMode, Error, ErrorChain, MessageEditP pub(crate) use core::{reset_backtrace_preference, set_backtrace_preference_override}; pub use context::Context; +pub use diagnostics::{DiagnosticVisibility, Diagnostics, DocLink, Hint, Suggestion}; pub(crate) use metadata::duration_to_string; pub use metadata::{Field, FieldRedaction, FieldValue, Metadata, field}; diff --git a/src/app_error/core/builder.rs b/src/app_error/core/builder.rs index 2af4589..c803749 100644 --- a/src/app_error/core/builder.rs +++ b/src/app_error/core/builder.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -417,4 +417,195 @@ impl Error { self.mark_dirty(); self } + + // ───────────────────────────────────────────────────────────────────────── + // Diagnostics builder methods + // ───────────────────────────────────────────────────────────────────────── + + /// Adds a development-only hint to explain the error. + /// + /// Hints provide context about why an error occurred without necessarily + /// offering a solution. They are only shown in Local (development) mode. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::not_found("User not found") + /// .with_hint("Check if the user ID is correct") + /// .with_hint("User might have been deleted"); + /// ``` + #[must_use] + pub fn with_hint(mut self, message: impl Into>) -> Self { + use crate::app_error::diagnostics::Hint; + self.ensure_diagnostics().hints.push(Hint::new(message)); + self.mark_dirty(); + self + } + + /// Adds a hint with custom visibility. + /// + /// Use this when a hint should be visible in Staging or Production. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, DiagnosticVisibility}; + /// + /// let err = AppError::unauthorized("Invalid token").with_hint_visible( + /// "Token may have expired, please login again", + /// DiagnosticVisibility::Public + /// ); + /// ``` + #[must_use] + pub fn with_hint_visible( + mut self, + message: impl Into>, + visibility: crate::app_error::diagnostics::DiagnosticVisibility + ) -> Self { + use crate::app_error::diagnostics::Hint; + self.ensure_diagnostics() + .hints + .push(Hint::with_visibility(message, visibility)); + self.mark_dirty(); + self + } + + /// Adds an actionable suggestion to fix the error. + /// + /// Suggestions provide concrete steps users can take to resolve an error. + /// They are only shown in Local (development) mode by default. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("Connection failed") + /// .with_suggestion("Check if the database server is running"); + /// ``` + #[must_use] + pub fn with_suggestion(mut self, message: impl Into>) -> Self { + use crate::app_error::diagnostics::Suggestion; + self.ensure_diagnostics() + .suggestions + .push(Suggestion::new(message)); + self.mark_dirty(); + self + } + + /// Adds a suggestion with an executable command or code snippet. + /// + /// The command is displayed in a distinct style to indicate it can be + /// copied and executed. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("PostgreSQL connection refused") + /// .with_suggestion_cmd( + /// "Check if PostgreSQL is running", + /// "systemctl status postgresql" + /// ); + /// ``` + #[must_use] + pub fn with_suggestion_cmd( + mut self, + message: impl Into>, + command: impl Into> + ) -> Self { + use crate::app_error::diagnostics::Suggestion; + self.ensure_diagnostics() + .suggestions + .push(Suggestion::with_command(message, command)); + self.mark_dirty(); + self + } + + /// Links to documentation explaining this error. + /// + /// Documentation links are publicly visible by default, helping end users + /// understand and resolve errors. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::not_found("User not found") + /// .with_docs("https://docs.example.com/errors/USER_NOT_FOUND"); + /// ``` + #[must_use] + pub fn with_docs(mut self, url: impl Into>) -> Self { + use crate::app_error::diagnostics::DocLink; + self.ensure_diagnostics().doc_link = Some(DocLink::new(url)); + self.mark_dirty(); + self + } + + /// Links to documentation with a human-readable title. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::unauthorized("Token expired").with_docs_titled( + /// "https://docs.example.com/auth/tokens", + /// "Authentication Guide" + /// ); + /// ``` + #[must_use] + pub fn with_docs_titled( + mut self, + url: impl Into>, + title: impl Into> + ) -> Self { + use crate::app_error::diagnostics::DocLink; + self.ensure_diagnostics().doc_link = Some(DocLink::with_title(url, title)); + self.mark_dirty(); + self + } + + /// Adds a related error code for cross-reference. + /// + /// Related codes help users discover errors that might provide additional + /// context or alternative explanations. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("Connection timeout") + /// .with_related_code("DB_POOL_EXHAUSTED") + /// .with_related_code("DB_AUTH_FAILED"); + /// ``` + #[must_use] + pub fn with_related_code(mut self, code: impl Into>) -> Self { + self.ensure_diagnostics().related_codes.push(code.into()); + self.mark_dirty(); + self + } + + /// Returns a mutable reference to diagnostics, initializing if needed. + fn ensure_diagnostics(&mut self) -> &mut crate::app_error::diagnostics::Diagnostics { + use crate::app_error::diagnostics::Diagnostics; + if self.inner.diagnostics.is_none() { + self.inner.diagnostics = Some(Box::new(Diagnostics::new())); + } + self.inner + .diagnostics + .as_mut() + .expect("diagnostics initialized above") + } + + /// Returns diagnostics if present. + #[must_use] + pub fn diagnostics(&self) -> Option<&crate::app_error::diagnostics::Diagnostics> { + self.inner.diagnostics.as_deref() + } } diff --git a/src/app_error/core/display.rs b/src/app_error/core/display.rs index cc92573..3f8ef31 100644 --- a/src/app_error/core/display.rs +++ b/src/app_error/core/display.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -273,6 +273,76 @@ impl Error { writeln!(f, " {}: {}", style::metadata_key(key), value)?; } } + // Diagnostics (hints, suggestions, docs) + if let Some(diag) = &self.diagnostics { + use crate::app_error::diagnostics::DiagnosticVisibility; + let min_visibility = DiagnosticVisibility::DevOnly; + + // Hints + let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); + if !hints.is_empty() { + writeln!(f)?; + for hint in hints { + writeln!( + f, + " {}: {}", + style::hint_label("hint"), + style::hint_text(&hint.message) + )?; + } + } + + // Suggestions + for suggestion in diag.visible_suggestions(min_visibility) { + writeln!(f)?; + write!( + f, + " {}: {}", + style::suggestion_label("suggestion"), + style::suggestion_text(&suggestion.message) + )?; + if let Some(cmd) = &suggestion.command { + writeln!(f)?; + writeln!(f, " {}", style::command(cmd))?; + } else { + writeln!(f)?; + } + } + + // Documentation link + if let Some(doc) = diag.visible_doc_link(min_visibility) { + writeln!(f)?; + if let Some(title) = &doc.title { + writeln!( + f, + " {}: {} ({})", + style::docs_label("docs"), + title, + style::url(&doc.url) + )?; + } else { + writeln!( + f, + " {}: {}", + style::docs_label("docs"), + style::url(&doc.url) + )?; + } + } + + // Related codes + if !diag.related_codes.is_empty() { + writeln!(f)?; + write!(f, " {}: ", style::related_label("see also"))?; + for (i, code) in diag.related_codes.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", style::error_code(code))?; + } + writeln!(f)?; + } + } Ok(()) } #[cfg(not(feature = "colored"))] @@ -303,6 +373,55 @@ impl Error { writeln!(f, " {}: {}", key, value)?; } } + // Diagnostics (hints, suggestions, docs) + if let Some(diag) = &self.diagnostics { + use crate::app_error::diagnostics::DiagnosticVisibility; + let min_visibility = DiagnosticVisibility::DevOnly; + + // Hints + let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); + if !hints.is_empty() { + writeln!(f)?; + for hint in hints { + writeln!(f, " hint: {}", hint.message)?; + } + } + + // Suggestions + for suggestion in diag.visible_suggestions(min_visibility) { + writeln!(f)?; + write!(f, " suggestion: {}", suggestion.message)?; + if let Some(cmd) = &suggestion.command { + writeln!(f)?; + writeln!(f, " {}", cmd)?; + } else { + writeln!(f)?; + } + } + + // Documentation link + if let Some(doc) = diag.visible_doc_link(min_visibility) { + writeln!(f)?; + if let Some(title) = &doc.title { + writeln!(f, " docs: {} ({})", title, doc.url)?; + } else { + writeln!(f, " docs: {}", doc.url)?; + } + } + + // Related codes + if !diag.related_codes.is_empty() { + writeln!(f)?; + write!(f, " see also: ")?; + for (i, code) in diag.related_codes.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", code)?; + } + writeln!(f)?; + } + } Ok(()) } } diff --git a/src/app_error/core/error.rs b/src/app_error/core/error.rs index 9bb9564..9e4c106 100644 --- a/src/app_error/core/error.rs +++ b/src/app_error/core/error.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -18,7 +18,10 @@ use serde_json::Value as JsonValue; #[cfg(not(feature = "backtrace"))] use super::types::CapturedBacktrace; use super::types::MessageEditPolicy; -use crate::{AppCode, AppErrorKind, RetryAdvice, app_error::metadata::Metadata}; +use crate::{ + AppCode, AppErrorKind, RetryAdvice, + app_error::{diagnostics::Diagnostics, metadata::Metadata} +}; /// Internal representation of error state. /// @@ -49,6 +52,10 @@ pub struct ErrorInner { #[cfg(not(feature = "serde_json"))] pub details: Option, pub source: Option>, + /// Diagnostic information (hints, suggestions, documentation). + /// + /// Stored as `Option>` for zero-cost when not used. + pub diagnostics: Option>, #[cfg(feature = "backtrace")] pub backtrace: Option>, #[cfg(feature = "backtrace")] @@ -194,6 +201,7 @@ impl Error { www_authenticate: None, details: None, source: None, + diagnostics: None, #[cfg(feature = "backtrace")] backtrace: None, #[cfg(feature = "backtrace")] diff --git a/src/app_error/diagnostics.rs b/src/app_error/diagnostics.rs new file mode 100644 index 0000000..53fb166 --- /dev/null +++ b/src/app_error/diagnostics.rs @@ -0,0 +1,509 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Diagnostic information for enhanced error reporting. +//! +//! This module provides rich diagnostic capabilities for errors, inspired by +//! compiler diagnostics (rustc, miette) but designed for runtime application +//! errors. +//! +//! # Features +//! +//! - **Hints**: Contextual advice explaining why an error occurred +//! - **Suggestions**: Actionable fixes with optional commands/code snippets +//! - **Documentation links**: URLs to detailed explanations +//! - **Related codes**: Cross-references to related error codes +//! - **Visibility control**: Per-item visibility for dev/staging/prod +//! environments +//! +//! # Example +//! +//! ```rust +//! use masterror::{AppError, DiagnosticVisibility}; +//! +//! let err = AppError::not_found("User not found") +//! .with_hint("Check if the user ID is correct") +//! .with_hint("User might have been deleted") +//! .with_suggestion_cmd("List all users to verify", "curl -X GET /api/users") +//! .with_docs("https://docs.example.com/errors/USER_NOT_FOUND"); +//! ``` +//! +//! # Display Modes +//! +//! Diagnostics are filtered based on [`DisplayMode`](crate::DisplayMode): +//! +//! | Visibility | Local | Staging | Prod | +//! |------------|-------|---------|------| +//! | `DevOnly` | ✅ | ❌ | ❌ | +//! | `Internal` | ✅ | ✅ | ❌ | +//! | `Public` | ✅ | ✅ | ✅ | + +use alloc::borrow::Cow; + +use super::inline_vec::InlineVec; + +/// Visibility of diagnostic information across environments. +/// +/// Controls where hints, suggestions, and other diagnostic information +/// are displayed based on the deployment environment. +/// +/// # Ordering +/// +/// Variants are ordered from most restrictive to least restrictive: +/// `DevOnly < Internal < Public`. This enables filtering with simple +/// comparisons. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(u8)] +pub enum DiagnosticVisibility { + /// Shown only in Local mode (development). + /// + /// Use for internal debugging hints that may expose implementation + /// details or sensitive information. + #[default] + DevOnly = 0, + + /// Shown in Local and Staging environments. + /// + /// Use for hints that help with testing and debugging but should + /// not reach production users. + Internal = 1, + + /// Shown everywhere including Production. + /// + /// Use for user-facing hints and documentation links that help + /// end users understand and resolve errors. + Public = 2 +} + +/// A single hint providing context about an error. +/// +/// Hints explain why an error might have occurred without necessarily +/// providing a fix. They help developers and users understand the +/// error context. +/// +/// # Example +/// +/// ```rust +/// use masterror::diagnostics::{DiagnosticVisibility, Hint}; +/// +/// let hint = Hint { +/// message: "Database connection pool may be exhausted".into(), +/// visibility: DiagnosticVisibility::Internal +/// }; +/// ``` +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Hint { + /// The hint message. + pub message: Cow<'static, str>, + + /// Where this hint should be displayed. + pub visibility: DiagnosticVisibility +} + +impl Hint { + /// Creates a new hint with default (DevOnly) visibility. + #[must_use] + pub fn new(message: impl Into>) -> Self { + Self { + message: message.into(), + visibility: DiagnosticVisibility::DevOnly + } + } + + /// Creates a new hint with specified visibility. + #[must_use] + pub fn with_visibility( + message: impl Into>, + visibility: DiagnosticVisibility + ) -> Self { + Self { + message: message.into(), + visibility + } + } + + /// Creates a public hint visible in all environments. + #[must_use] + pub fn public(message: impl Into>) -> Self { + Self::with_visibility(message, DiagnosticVisibility::Public) + } + + /// Creates an internal hint visible in Local and Staging. + #[must_use] + pub fn internal(message: impl Into>) -> Self { + Self::with_visibility(message, DiagnosticVisibility::Internal) + } +} + +/// An actionable suggestion to fix an error. +/// +/// Suggestions provide concrete steps users can take to resolve an error, +/// optionally including a command or code snippet. +/// +/// # Example +/// +/// ```rust +/// use masterror::diagnostics::{DiagnosticVisibility, Suggestion}; +/// +/// let suggestion = Suggestion { +/// message: "Check if PostgreSQL is running".into(), +/// command: Some("systemctl status postgresql".into()), +/// visibility: DiagnosticVisibility::DevOnly +/// }; +/// ``` +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Suggestion { + /// Human-readable description of the suggestion. + pub message: Cow<'static, str>, + + /// Optional command or code snippet. + /// + /// When present, displayed in a distinct style (monospace, highlighted) + /// to indicate it can be copied and executed. + pub command: Option>, + + /// Where this suggestion should be displayed. + pub visibility: DiagnosticVisibility +} + +impl Suggestion { + /// Creates a new suggestion without a command. + #[must_use] + pub fn new(message: impl Into>) -> Self { + Self { + message: message.into(), + command: None, + visibility: DiagnosticVisibility::DevOnly + } + } + + /// Creates a new suggestion with a command. + #[must_use] + pub fn with_command( + message: impl Into>, + command: impl Into> + ) -> Self { + Self { + message: message.into(), + command: Some(command.into()), + visibility: DiagnosticVisibility::DevOnly + } + } + + /// Sets the visibility for this suggestion. + #[must_use] + pub fn visibility(mut self, visibility: DiagnosticVisibility) -> Self { + self.visibility = visibility; + self + } +} + +/// A link to documentation explaining the error. +/// +/// Documentation links provide detailed explanations and context that +/// don't fit in hint messages. They typically point to error catalogs, +/// API documentation, or troubleshooting guides. +/// +/// # Example +/// +/// ```rust +/// use masterror::diagnostics::{DiagnosticVisibility, DocLink}; +/// +/// let doc = DocLink { +/// url: "https://docs.example.com/errors/E001".into(), +/// title: Some("Connection Errors".into()), +/// visibility: DiagnosticVisibility::Public +/// }; +/// ``` +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DocLink { + /// URL to documentation. + pub url: Cow<'static, str>, + + /// Optional human-readable title for the link. + pub title: Option>, + + /// Where this link should be displayed. + /// + /// Documentation links are typically `Public` since they help + /// end users understand errors. + pub visibility: DiagnosticVisibility +} + +impl DocLink { + /// Creates a new documentation link with public visibility. + #[must_use] + pub fn new(url: impl Into>) -> Self { + Self { + url: url.into(), + title: None, + visibility: DiagnosticVisibility::Public + } + } + + /// Creates a new documentation link with a title. + #[must_use] + pub fn with_title( + url: impl Into>, + title: impl Into> + ) -> Self { + Self { + url: url.into(), + title: Some(title.into()), + visibility: DiagnosticVisibility::Public + } + } + + /// Sets the visibility for this link. + #[must_use] + pub fn visibility(mut self, visibility: DiagnosticVisibility) -> Self { + self.visibility = visibility; + self + } +} + +/// Complete diagnostic information for an error. +/// +/// This structure collects all diagnostic information associated with an +/// error. It is stored in `Option>` to ensure zero cost +/// when diagnostics are not used. +/// +/// # Memory Layout +/// +/// The structure uses [`InlineVec`] for hints and suggestions, which stores +/// up to 4 elements inline without heap allocation. This optimizes for the +/// common case of 1-2 hints/suggestions per error. +/// +/// # Example +/// +/// ```rust +/// use masterror::diagnostics::{Diagnostics, DocLink, Hint, Suggestion}; +/// +/// let mut diag = Diagnostics::new(); +/// diag.hints.push(Hint::new("Check configuration")); +/// diag.suggestions.push(Suggestion::with_command( +/// "Restart the service", +/// "systemctl restart myapp" +/// )); +/// diag.doc_link = Some(DocLink::new("https://docs.example.com/errors")); +/// ``` +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct Diagnostics { + /// Contextual hints explaining the error. + /// + /// Hints provide context without necessarily offering a solution. + /// Multiple hints can be attached to explain different aspects. + pub hints: InlineVec, + + /// Actionable suggestions to fix the error. + /// + /// Suggestions provide concrete steps to resolve the error. + /// Usually 0-2 suggestions are most helpful. + pub suggestions: InlineVec, + + /// Link to detailed documentation. + /// + /// Only one documentation link is supported per error to avoid + /// overwhelming users with choices. + pub doc_link: Option, + + /// Related error codes for cross-reference. + /// + /// Helps users discover related errors that might provide additional + /// context or alternative explanations. + pub related_codes: InlineVec> +} + +impl Diagnostics { + /// Creates an empty diagnostics container. + #[must_use] + pub const fn new() -> Self { + Self { + hints: InlineVec::new(), + suggestions: InlineVec::new(), + doc_link: None, + related_codes: InlineVec::new() + } + } + + /// Returns `true` if no diagnostic information is present. + #[must_use] + pub fn is_empty(&self) -> bool { + self.hints.is_empty() + && self.suggestions.is_empty() + && self.doc_link.is_none() + && self.related_codes.is_empty() + } + + /// Returns `true` if any diagnostic information has the given visibility + /// or higher. + #[must_use] + pub fn has_visible_content(&self, min_visibility: DiagnosticVisibility) -> bool { + self.hints.iter().any(|h| h.visibility >= min_visibility) + || self + .suggestions + .iter() + .any(|s| s.visibility >= min_visibility) + || self + .doc_link + .as_ref() + .is_some_and(|d| d.visibility >= min_visibility) + } + + /// Returns an iterator over hints visible at the given level. + pub fn visible_hints( + &self, + min_visibility: DiagnosticVisibility + ) -> impl Iterator { + self.hints + .iter() + .filter(move |h| h.visibility >= min_visibility) + } + + /// Returns an iterator over suggestions visible at the given level. + pub fn visible_suggestions( + &self, + min_visibility: DiagnosticVisibility + ) -> impl Iterator { + self.suggestions + .iter() + .filter(move |s| s.visibility >= min_visibility) + } + + /// Returns the documentation link if visible at the given level. + #[must_use] + pub fn visible_doc_link(&self, min_visibility: DiagnosticVisibility) -> Option<&DocLink> { + self.doc_link + .as_ref() + .filter(|d| d.visibility >= min_visibility) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn visibility_ordering() { + assert!(DiagnosticVisibility::DevOnly < DiagnosticVisibility::Internal); + assert!(DiagnosticVisibility::Internal < DiagnosticVisibility::Public); + } + + #[test] + fn hint_constructors() { + let hint = Hint::new("test"); + assert_eq!(hint.visibility, DiagnosticVisibility::DevOnly); + + let public = Hint::public("test"); + assert_eq!(public.visibility, DiagnosticVisibility::Public); + + let internal = Hint::internal("test"); + assert_eq!(internal.visibility, DiagnosticVisibility::Internal); + } + + #[test] + fn suggestion_constructors() { + let suggestion = Suggestion::new("do this"); + assert!(suggestion.command.is_none()); + + let with_cmd = Suggestion::with_command("do this", "some command"); + assert_eq!(with_cmd.command.as_deref(), Some("some command")); + } + + #[test] + fn doc_link_constructors() { + let link = DocLink::new("https://example.com"); + assert!(link.title.is_none()); + assert_eq!(link.visibility, DiagnosticVisibility::Public); + + let titled = DocLink::with_title("https://example.com", "Example"); + assert_eq!(titled.title.as_deref(), Some("Example")); + } + + #[test] + fn diagnostics_is_empty() { + let diag = Diagnostics::new(); + assert!(diag.is_empty()); + + let mut diag = Diagnostics::new(); + diag.hints.push(Hint::new("test")); + assert!(!diag.is_empty()); + } + + #[test] + fn diagnostics_visibility_filtering() { + let mut diag = Diagnostics::new(); + diag.hints.push(Hint::new("dev hint")); + diag.hints.push(Hint::internal("internal hint")); + diag.hints.push(Hint::public("public hint")); + + // DevOnly level sees all + let dev_hints: Vec<_> = diag.visible_hints(DiagnosticVisibility::DevOnly).collect(); + assert_eq!(dev_hints.len(), 3); + + // Internal level sees internal + public + let internal_hints: Vec<_> = diag.visible_hints(DiagnosticVisibility::Internal).collect(); + assert_eq!(internal_hints.len(), 2); + + // Public level sees only public + let public_hints: Vec<_> = diag.visible_hints(DiagnosticVisibility::Public).collect(); + assert_eq!(public_hints.len(), 1); + assert_eq!(public_hints[0].message, "public hint"); + } + + #[test] + fn diagnostics_has_visible_content() { + let mut diag = Diagnostics::new(); + assert!(!diag.has_visible_content(DiagnosticVisibility::DevOnly)); + + diag.hints.push(Hint::new("dev only")); + assert!(diag.has_visible_content(DiagnosticVisibility::DevOnly)); + assert!(!diag.has_visible_content(DiagnosticVisibility::Internal)); + assert!(!diag.has_visible_content(DiagnosticVisibility::Public)); + + diag.suggestions + .push(Suggestion::new("fix it").visibility(DiagnosticVisibility::Public)); + assert!(diag.has_visible_content(DiagnosticVisibility::Public)); + } + + #[test] + fn diagnostics_doc_link_visibility() { + let mut diag = Diagnostics::new(); + diag.doc_link = Some(DocLink::new("https://example.com")); + + assert!( + diag.visible_doc_link(DiagnosticVisibility::Public) + .is_some() + ); + assert!( + diag.visible_doc_link(DiagnosticVisibility::Internal) + .is_some() + ); + assert!( + diag.visible_doc_link(DiagnosticVisibility::DevOnly) + .is_some() + ); + + // Change to internal visibility + diag.doc_link = + Some(DocLink::new("https://example.com").visibility(DiagnosticVisibility::Internal)); + assert!( + diag.visible_doc_link(DiagnosticVisibility::Internal) + .is_some() + ); + assert!( + diag.visible_doc_link(DiagnosticVisibility::Public) + .is_none() + ); + } + + #[test] + fn cow_static_str() { + let hint = Hint::new("static string"); + assert!(matches!(hint.message, Cow::Borrowed(_))); + + let hint = Hint::new(alloc::string::String::from("owned string")); + assert!(matches!(hint.message, Cow::Owned(_))); + } +} diff --git a/src/app_error/inline_vec.rs b/src/app_error/inline_vec.rs index d24e6df..fed94cb 100644 --- a/src/app_error/inline_vec.rs +++ b/src/app_error/inline_vec.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -37,12 +37,12 @@ const INLINE_CAPACITY: usize = 4; /// assert_eq!(vec.len(), 2); /// assert!(vec.is_inline()); // Still on stack /// ``` -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct InlineVec { storage: Storage } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq)] enum Storage { /// Inline storage for 0-4 elements using fixed arrays. /// diff --git a/src/colored.rs b/src/colored.rs index 2bb2f23..c5d37df 100644 --- a/src/colored.rs +++ b/src/colored.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -249,6 +249,110 @@ pub mod style { .if_supports_color(Stream::Stderr, |t| t.green()) .to_string() } + + // ───────────────────────────────────────────────────────────────────────── + // Diagnostic styling + // ───────────────────────────────────────────────────────────────────────── + + /// Style hint label in blue. + /// + /// # Color Behavior + /// + /// - TTY: Blue text + /// - Non-TTY: Plain text + pub fn hint_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.blue()) + .to_string() + } + + /// Style hint message in bright blue. + /// + /// # Color Behavior + /// + /// - TTY: Bright blue text + /// - Non-TTY: Plain text + pub fn hint_text(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.bright_blue()) + .to_string() + } + + /// Style suggestion label in magenta. + /// + /// # Color Behavior + /// + /// - TTY: Magenta text + /// - Non-TTY: Plain text + pub fn suggestion_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.magenta()) + .to_string() + } + + /// Style suggestion message in bright magenta. + /// + /// # Color Behavior + /// + /// - TTY: Bright magenta text + /// - Non-TTY: Plain text + pub fn suggestion_text(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.bright_magenta()) + .to_string() + } + + /// Style command/code snippet in bold bright white. + /// + /// # Color Behavior + /// + /// - TTY: Bold bright white text + /// - Non-TTY: Plain text + pub fn command(text: impl AsRef) -> String { + use owo_colors::Style; + let style = Style::new().bold().bright_white(); + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.style(style)) + .to_string() + } + + /// Style documentation link label in cyan. + /// + /// # Color Behavior + /// + /// - TTY: Cyan text + /// - Non-TTY: Plain text + pub fn docs_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.cyan()) + .to_string() + } + + /// Style URL in underlined cyan. + /// + /// # Color Behavior + /// + /// - TTY: Underlined cyan text + /// - Non-TTY: Plain text + pub fn url(text: impl AsRef) -> String { + use owo_colors::Style; + let style = Style::new().underline().cyan(); + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.style(style)) + .to_string() + } + + /// Style "see also" label in dimmed text. + /// + /// # Color Behavior + /// + /// - TTY: Dimmed text + /// - Non-TTY: Plain text + pub fn related_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.dimmed()) + .to_string() + } } /// No-op styling for no-std builds. @@ -283,6 +387,46 @@ pub mod style { pub fn metadata_key(text: impl AsRef) -> String { text.as_ref().to_string() } + + /// Style hint label. + pub fn hint_label(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style hint message. + pub fn hint_text(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style suggestion label. + pub fn suggestion_label(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style suggestion message. + pub fn suggestion_text(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style command/code snippet. + pub fn command(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style documentation link label. + pub fn docs_label(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style URL. + pub fn url(text: impl AsRef) -> String { + text.as_ref().to_string() + } + + /// Style "see also" label. + pub fn related_label(text: impl AsRef) -> String { + text.as_ref().to_string() + } } #[cfg(all(test, not(feature = "std")))] diff --git a/src/lib.rs b/src/lib.rs index e086186..5459dd7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 RAprogramm +// SPDX-FileCopyrightText: 2025-2026 RAprogramm // // SPDX-License-Identifier: MIT @@ -378,9 +378,14 @@ pub mod prelude; pub mod mapping; pub use app_error::{ - AppError, AppResult, Context, DisplayMode, Error, ErrorChain, Field, FieldRedaction, - FieldValue, MessageEditPolicy, Metadata, field + AppError, AppResult, Context, DiagnosticVisibility, Diagnostics, DisplayMode, DocLink, Error, + ErrorChain, Field, FieldRedaction, FieldValue, Hint, MessageEditPolicy, Metadata, Suggestion, + field }; +/// Diagnostic types for enhanced error reporting. +pub mod diagnostics { + pub use crate::app_error::diagnostics::*; +} pub use code::{AppCode, ParseAppCodeError}; pub use kind::AppErrorKind; /// Re-export derive macros so users only depend on this crate. From 26b70ce146b64dfc03bfd289b6a64389accc192c Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 10:37:26 +0700 Subject: [PATCH 02/16] feat(cli): add masterror-cli for compiler error explanations Add a CLI tool to help Rust learners understand compiler errors: - `masterror check` - runs cargo check with friendly explanations - `masterror explain E0382` - explains specific error codes - `masterror list` - lists known error codes by category Features: - Multi-language support (en, ru) - Colored terminal output with NO_COLOR support - Knowledge base for common errors (E0382, E0308, E0502, E0499, E0106, E0597) - Direct links to official Rust documentation --- Cargo.lock | 198 ++++++++++++ Cargo.toml | 1 + masterror-cli/Cargo.toml | 34 +++ masterror-cli/README.md | 104 +++++++ masterror-cli/src/main.rs | 615 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 952 insertions(+) create mode 100644 masterror-cli/Cargo.toml create mode 100644 masterror-cli/README.md create mode 100644 masterror-cli/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index a97000b..331f24e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,12 +225,56 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.100" @@ -258,6 +302,21 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "assert_cmd" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c5bcfa8749ac45dd12cb11055aeeb6b27a3895560d60d71e3c23bf979e60514" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "async-trait" version = "0.1.89" @@ -435,6 +494,17 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.19.1" @@ -544,6 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] @@ -552,8 +623,23 @@ version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ + "anstream", "anstyle", "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -562,6 +648,12 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "combine" version = "4.6.7" @@ -972,6 +1064,12 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.10.7" @@ -1185,6 +1283,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "flume" version = "0.11.1" @@ -1838,6 +1945,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itertools" version = "0.13.0" @@ -2005,6 +2118,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "masterror-cli" +version = "0.1.0" +dependencies = [ + "assert_cmd", + "clap", + "owo-colors", + "predicates", + "serde", + "serde_json", +] + [[package]] name = "masterror-derive" version = "0.11.2" @@ -2122,6 +2247,12 @@ dependencies = [ "tempfile", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2242,6 +2373,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "oorandom" version = "11.1.5" @@ -2532,6 +2669,36 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3612,6 +3779,22 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "thiserror" version = "2.0.18" @@ -4074,6 +4257,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "utoipa" version = "5.4.0" @@ -4157,6 +4346,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 3b7d835..aa1688b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ include = [ members = [ "masterror-derive", "masterror-template", + "masterror-cli", "examples/axum-rest-api", "examples/custom-domain-errors", "examples/sqlx-database", diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml new file mode 100644 index 0000000..c2d54ed --- /dev/null +++ b/masterror-cli/Cargo.toml @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +[package] +name = "masterror-cli" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +readme = "README.md" +description = "CLI tool for explaining Rust compiler errors in human-friendly language" +keywords = ["rust", "compiler", "errors", "explain", "learning"] +categories = ["command-line-utilities", "development-tools"] + +[[bin]] +name = "masterror" +path = "src/main.rs" + +[dependencies] +# CLI framework +clap = { version = "4", features = ["derive", "env", "wrap_help"] } + +# Colored output +owo-colors = { version = "4", features = ["supports-colors"] } + +# JSON parsing (cargo output) +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dev-dependencies] +assert_cmd = "2" +predicates = "3" diff --git a/masterror-cli/README.md b/masterror-cli/README.md new file mode 100644 index 0000000..76fcde6 --- /dev/null +++ b/masterror-cli/README.md @@ -0,0 +1,104 @@ + + +# masterror-cli + +CLI tool for explaining Rust compiler errors in human-friendly language. + +## Installation + +```bash +cargo install masterror-cli +``` + +## Usage + +### Check and explain errors + +```bash +# Run cargo check with explanations +masterror check + +# Pass additional arguments to cargo +masterror check --release +masterror check -p my-crate +``` + +### Explain specific error + +```bash +# Explain an error code +masterror explain E0382 +masterror explain 0382 # E prefix is optional + +# In Russian +masterror explain E0382 --lang ru +``` + +### List known errors + +```bash +# List all known errors +masterror list + +# Filter by category +masterror list --category ownership +masterror list --category lifetimes +``` + +## Language Support + +Set language via flag or environment variable: + +```bash +# Flag +masterror check --lang ru + +# Environment variable +export MASTERROR_LANG=ru +masterror check +``` + +Supported languages: +- `en` - English (default) +- `ru` - Russian + +## Example Output + +``` +❌ E0382 - Use of moved value + + let s = String::from("hello"); + let s2 = s; // s moved to s2 + println!("{}", s); // error: s is no longer valid + + --> src/main.rs:5:10 + +📖 Why? + In Rust, each value has exactly one owner. When you assign a value + to another variable (like `let s2 = s`), ownership MOVES to the new + variable. The original variable becomes invalid. + +💡 How to fix? + • Clone the value if you need two independent copies + let s2 = s.clone(); + • Borrow with a reference if you just need to read + let s2 = &s; + +🔗 Learn more: https://doc.rust-lang.org/error_codes/E0382.html +``` + +## Contributing + +Adding new error explanations: + +1. Add `ErrorEntry` in `get_knowledge_base()` function in `src/main.rs` +2. Add translations in `Locale::english()` and `Locale::russian()` methods +3. Submit PR + +## License + +MIT diff --git a/masterror-cli/src/main.rs b/masterror-cli/src/main.rs new file mode 100644 index 0000000..3c9eed8 --- /dev/null +++ b/masterror-cli/src/main.rs @@ -0,0 +1,615 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! masterror CLI - Rust compiler error explainer. + +use std::{ + collections::HashMap, + io::{BufRead, BufReader}, + process::{Command, Stdio} +}; + +use clap::{Parser, Subcommand}; +use owo_colors::OwoColorize; +use serde::Deserialize; + +// ───────────────────────────────────────────────────────────────────────────── +// CLI Definition +// ───────────────────────────────────────────────────────────────────────────── + +#[derive(Parser, Debug)] +#[command(name = "masterror")] +#[command(author, version, about = "Rust compiler error explainer")] +#[command(propagate_version = true)] +struct Cli { + /// Language for explanations (en, ru) + #[arg(short, long, env = "MASTERROR_LANG", default_value = "en")] + lang: String, + + /// Disable colored output + #[arg(long, env = "NO_COLOR")] + no_color: bool, + + #[command(subcommand)] + command: Commands +} + +#[derive(Subcommand, Debug)] +enum Commands { + /// Run cargo check and explain errors + Check { + #[arg(trailing_var_arg = true)] + args: Vec + }, + /// Explain a specific error code + Explain { code: String }, + /// List all known error codes + List { + #[arg(short, long)] + category: Option + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Localization +// ───────────────────────────────────────────────────────────────────────────── + +struct Locale { + messages: HashMap<&'static str, &'static str> +} + +impl Locale { + fn new(lang: &str) -> Self { + let messages = match lang { + "ru" => Self::russian(), + _ => Self::english() + }; + Self { + messages + } + } + + fn get(&self, key: &'static str) -> &'static str { + self.messages.get(key).copied().unwrap_or(key) + } + + fn english() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + m.insert("label-why", "📖 Why?"); + m.insert("label-fix", "💡 How to fix?"); + m.insert("label-link", "🔗 Learn more:"); + m.insert("label-example", "📝 Example:"); + m.insert("category-ownership", "Ownership"); + m.insert("category-types", "Types"); + m.insert("category-lifetimes", "Lifetimes"); + m.insert("category-borrowing", "Borrowing"); + + // E0382 + m.insert("e0382-title", "Use of moved value"); + m.insert("e0382-explanation", "In Rust, each value has exactly one owner. When you assign\n a value to another variable, ownership MOVES. The original\n variable becomes invalid and cannot be used anymore."); + m.insert("e0382-fix-clone", "Clone the value: let s2 = s.clone();"); + m.insert("e0382-fix-borrow", "Borrow with reference: let s2 = &s;"); + + // E0308 + m.insert("e0308-title", "Mismatched types"); + m.insert("e0308-explanation", "Rust is statically typed. You're using a value of one type\n where a different type is expected. Rust doesn't do automatic\n type conversion."); + m.insert("e0308-fix-type", "Change the type annotation to match"); + m.insert( + "e0308-fix-convert", + "Convert using .parse(), .into(), or as" + ); + + // E0502 + m.insert( + "e0502-title", + "Cannot borrow as mutable (already borrowed as immutable)" + ); + m.insert("e0502-explanation", "Rust's rule: you can have ONE mutable reference OR any number\n of immutable references, but not both at the same time."); + m.insert( + "e0502-fix", + "End the immutable borrow before creating a mutable one" + ); + + // E0499 + m.insert("e0499-title", "Cannot borrow as mutable more than once"); + m.insert( + "e0499-explanation", + "You can only have one mutable reference at a time.\n This prevents data races." + ); + m.insert( + "e0499-fix", + "Use scopes to ensure only one mutable borrow exists" + ); + + // E0106 + m.insert("e0106-title", "Missing lifetime specifier"); + m.insert("e0106-explanation", "References in structs need lifetime annotations.\n They tell the compiler how long the reference is valid."); + m.insert( + "e0106-fix-lifetime", + "Add lifetime: struct Foo<'a> { x: &'a str }" + ); + m.insert("e0106-fix-owned", "Use owned type: String instead of &str"); + + // E0597 + m.insert("e0597-title", "Value does not live long enough"); + m.insert("e0597-explanation", "You're creating a reference to something that will be\n destroyed before the reference is used."); + m.insert( + "e0597-fix", + "Move the value to a scope where it lives long enough" + ); + + m + } + + fn russian() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + m.insert("label-why", "📖 Почему?"); + m.insert("label-fix", "💡 Как исправить?"); + m.insert("label-link", "🔗 Подробнее:"); + m.insert("label-example", "📝 Пример:"); + m.insert("category-ownership", "Владение (Ownership)"); + m.insert("category-types", "Типы"); + m.insert("category-lifetimes", "Времена жизни (Lifetimes)"); + m.insert("category-borrowing", "Заимствование (Borrowing)"); + + // E0382 + m.insert("e0382-title", "Использование перемещённого значения"); + m.insert("e0382-explanation", "В Rust у каждого значения один владелец. Когда ты присваиваешь\n значение другой переменной, владение ПЕРЕМЕЩАЕТСЯ. Старая\n переменная становится недействительной."); + m.insert("e0382-fix-clone", "Клонируй: let s2 = s.clone();"); + m.insert("e0382-fix-borrow", "Заимствуй: let s2 = &s;"); + + // E0308 + m.insert("e0308-title", "Несовпадение типов"); + m.insert("e0308-explanation", "Rust статически типизирован. Ты используешь значение одного\n типа там, где ожидается другой. Rust не делает автоматическое\n преобразование типов."); + m.insert("e0308-fix-type", "Измени аннотацию типа"); + m.insert( + "e0308-fix-convert", + "Преобразуй через .parse(), .into() или as" + ); + + // E0502 + m.insert( + "e0502-title", + "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)" + ); + m.insert("e0502-explanation", "Правило Rust: можно иметь ОДНУ изменяемую ссылку ИЛИ любое\n количество неизменяемых, но не оба одновременно."); + m.insert( + "e0502-fix", + "Заверши неизменяемое заимствование перед созданием изменяемого" + ); + + // E0499 + m.insert( + "e0499-title", + "Нельзя заимствовать как изменяемое больше одного раза" + ); + m.insert("e0499-explanation", "Можно иметь только одну изменяемую ссылку одновременно.\n Это предотвращает гонки данных."); + m.insert( + "e0499-fix", + "Используй области видимости для одного изменяемого заимствования" + ); + + // E0106 + m.insert("e0106-title", "Отсутствует спецификатор времени жизни"); + m.insert("e0106-explanation", "Ссылки в структурах требуют аннотации времени жизни.\n Они говорят компилятору, как долго ссылка валидна."); + m.insert( + "e0106-fix-lifetime", + "Добавь время жизни: struct Foo<'a> { x: &'a str }" + ); + m.insert( + "e0106-fix-owned", + "Используй владеющий тип: String вместо &str" + ); + + // E0597 + m.insert("e0597-title", "Значение живёт недостаточно долго"); + m.insert( + "e0597-explanation", + "Ты создаёшь ссылку на что-то, что будет уничтожено\n до использования ссылки." + ); + m.insert( + "e0597-fix", + "Перемести значение туда, где оно живёт достаточно долго" + ); + + m + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Knowledge Base +// ───────────────────────────────────────────────────────────────────────────── + +struct ErrorEntry { + code: &'static str, + title_key: &'static str, + category: &'static str, + explanation_key: &'static str, + fixes: Vec<&'static str>, + doc_url: &'static str +} + +fn get_knowledge_base() -> Vec { + vec![ + ErrorEntry { + code: "E0382", + title_key: "e0382-title", + category: "ownership", + explanation_key: "e0382-explanation", + fixes: vec!["e0382-fix-clone", "e0382-fix-borrow"], + doc_url: "https://doc.rust-lang.org/error_codes/E0382.html" + }, + ErrorEntry { + code: "E0308", + title_key: "e0308-title", + category: "types", + explanation_key: "e0308-explanation", + fixes: vec!["e0308-fix-type", "e0308-fix-convert"], + doc_url: "https://doc.rust-lang.org/error_codes/E0308.html" + }, + ErrorEntry { + code: "E0502", + title_key: "e0502-title", + category: "borrowing", + explanation_key: "e0502-explanation", + fixes: vec!["e0502-fix"], + doc_url: "https://doc.rust-lang.org/error_codes/E0502.html" + }, + ErrorEntry { + code: "E0499", + title_key: "e0499-title", + category: "borrowing", + explanation_key: "e0499-explanation", + fixes: vec!["e0499-fix"], + doc_url: "https://doc.rust-lang.org/error_codes/E0499.html" + }, + ErrorEntry { + code: "E0106", + title_key: "e0106-title", + category: "lifetimes", + explanation_key: "e0106-explanation", + fixes: vec!["e0106-fix-lifetime", "e0106-fix-owned"], + doc_url: "https://doc.rust-lang.org/error_codes/E0106.html" + }, + ErrorEntry { + code: "E0597", + title_key: "e0597-title", + category: "lifetimes", + explanation_key: "e0597-explanation", + fixes: vec!["e0597-fix"], + doc_url: "https://doc.rust-lang.org/error_codes/E0597.html" + }, + ] +} + +// ───────────────────────────────────────────────────────────────────────────── +// Cargo JSON Parser +// ───────────────────────────────────────────────────────────────────────────── + +#[derive(Deserialize)] +struct CargoMessage { + reason: String, + message: Option +} + +#[derive(Deserialize)] +struct DiagnosticMessage { + level: String, + message: String, + code: Option, + spans: Vec +} + +#[derive(Deserialize)] +struct DiagnosticCode { + code: String +} + +#[derive(Deserialize)] +struct DiagnosticSpan { + file_name: String, + line_start: usize, + column_start: usize, + is_primary: bool +} + +// ───────────────────────────────────────────────────────────────────────────── +// Commands +// ───────────────────────────────────────────────────────────────────────────── + +fn cmd_check( + locale: &Locale, + args: &[String], + colored: bool +) -> Result<(), Box> { + let mut cmd = Command::new("cargo") + .arg("check") + .arg("--message-format=json") + .args(args) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn()?; + + let stdout = cmd.stdout.take().expect("stdout captured"); + let reader = BufReader::new(stdout); + let kb = get_knowledge_base(); + + let mut error_count = 0; + + for line in reader.lines() { + let line = line?; + if let Ok(msg) = serde_json::from_str::(&line) + && msg.reason == "compiler-message" + && let Some(diag) = msg.message + && diag.level == "error" + { + error_count += 1; + print_error(locale, &kb, &diag, colored); + } + } + + let status = cmd.wait()?; + + if error_count > 0 { + println!(); + println!( + "Found {} error(s). Run `masterror explain ` for details.", + error_count + ); + } + + if !status.success() { + std::process::exit(status.code().unwrap_or(1)); + } + + Ok(()) +} + +fn print_error(locale: &Locale, kb: &[ErrorEntry], diag: &DiagnosticMessage, colored: bool) { + println!(); + + let code_str = diag + .code + .as_ref() + .map(|c| c.code.as_str()) + .unwrap_or("unknown"); + + // Header + if colored { + println!("{} {}", "❌".red(), code_str.red().bold()); + } else { + println!("❌ {}", code_str); + } + + println!(" {}", diag.message); + + // Location + for span in diag.spans.iter().filter(|s| s.is_primary) { + if colored { + println!( + " {} {}:{}:{}", + "-->".blue(), + span.file_name, + span.line_start, + span.column_start + ); + } else { + println!( + " --> {}:{}:{}", + span.file_name, span.line_start, span.column_start + ); + } + } + + // Knowledge base lookup + if let Some(code) = &diag.code + && let Some(entry) = kb.iter().find(|e| e.code == code.code) + { + println!(); + let why = locale.get("label-why"); + if colored { + println!("{}", why.yellow().bold()); + } else { + println!("{}", why); + } + println!(" {}", locale.get(entry.explanation_key)); + + if !entry.fixes.is_empty() { + println!(); + let fix = locale.get("label-fix"); + if colored { + println!("{}", fix.green().bold()); + } else { + println!("{}", fix); + } + for fix_key in &entry.fixes { + println!(" • {}", locale.get(fix_key)); + } + } + + println!(); + let link = locale.get("label-link"); + if colored { + println!("{} {}", link.cyan(), entry.doc_url.underline().cyan()); + } else { + println!("{} {}", link, entry.doc_url); + } + } +} + +fn cmd_explain( + locale: &Locale, + code: &str, + colored: bool +) -> Result<(), Box> { + let kb = get_knowledge_base(); + + // Normalize code + let normalized = if code.starts_with('E') || code.starts_with('e') { + code.to_uppercase() + } else { + format!("E{}", code) + }; + + let Some(entry) = kb.iter().find(|e| e.code == normalized) else { + eprintln!("Unknown error code: {}", normalized); + eprintln!("Run `masterror list` to see available codes."); + std::process::exit(1); + }; + + println!(); + + // Title + let title = locale.get(entry.title_key); + if colored { + println!( + "{} {} - {}", + "📖".yellow(), + normalized.yellow().bold(), + title.bold() + ); + } else { + println!("📖 {} - {}", normalized, title); + } + + // Category + println!(); + let cat_key = format!("category-{}", entry.category); + let category = get_category_name(locale, &cat_key); + if colored { + println!("Category: {}", category.dimmed()); + } else { + println!("Category: {}", category); + } + + // Explanation + println!(); + let why = locale.get("label-why"); + if colored { + println!("{}", why.yellow().bold()); + } else { + println!("{}", why); + } + println!(" {}", locale.get(entry.explanation_key)); + + // Fixes + if !entry.fixes.is_empty() { + println!(); + let fix = locale.get("label-fix"); + if colored { + println!("{}", fix.green().bold()); + } else { + println!("{}", fix); + } + for fix_key in &entry.fixes { + println!(" • {}", locale.get(fix_key)); + } + } + + // Link + println!(); + let link = locale.get("label-link"); + if colored { + println!("{} {}", link.cyan(), entry.doc_url.underline().cyan()); + } else { + println!("{} {}", link, entry.doc_url); + } + + println!(); + Ok(()) +} + +fn get_category_name(locale: &Locale, key: &str) -> &'static str { + match key { + "category-ownership" => locale.get("category-ownership"), + "category-types" => locale.get("category-types"), + "category-lifetimes" => locale.get("category-lifetimes"), + "category-borrowing" => locale.get("category-borrowing"), + _ => "Unknown" + } +} + +fn cmd_list( + locale: &Locale, + category: Option<&str>, + colored: bool +) -> Result<(), Box> { + let kb = get_knowledge_base(); + + println!(); + if colored { + println!("{}", "Known Rust Compiler Errors".bold()); + } else { + println!("Known Rust Compiler Errors"); + } + println!(); + + let filtered: Vec<_> = if let Some(cat) = category { + kb.iter() + .filter(|e| e.category.eq_ignore_ascii_case(cat)) + .collect() + } else { + kb.iter().collect() + }; + + if filtered.is_empty() { + println!(" No errors found."); + return Ok(()); + } + + let mut current_cat = ""; + for entry in &filtered { + if entry.category != current_cat { + current_cat = entry.category; + println!(); + let cat_name = get_category_name(locale, &format!("category-{}", current_cat)); + if colored { + println!(" {}", cat_name.yellow().bold()); + } else { + println!(" {}", cat_name); + } + println!(); + } + + let title = locale.get(entry.title_key); + if colored { + println!(" {} - {}", entry.code.cyan(), title); + } else { + println!(" {} - {}", entry.code, title); + } + } + + println!(); + println!("Total: {} errors", filtered.len()); + println!(); + + Ok(()) +} + +// ───────────────────────────────────────────────────────────────────────────── +// Main +// ───────────────────────────────────────────────────────────────────────────── + +fn main() { + let cli = Cli::parse(); + let locale = Locale::new(&cli.lang); + let colored = !cli.no_color; + + let result = match cli.command { + Commands::Check { + ref args + } => cmd_check(&locale, args, colored), + Commands::Explain { + ref code + } => cmd_explain(&locale, code, colored), + Commands::List { + ref category + } => cmd_list(&locale, category.as_deref(), colored) + }; + + if let Err(e) = result { + eprintln!("Error: {}", e); + std::process::exit(1); + } +} From 5b729c5ae5110fe636a8a718a219f4f442c52857 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 10:49:19 +0700 Subject: [PATCH 03/16] feat(cli): add cli-test-errors example for testing masterror-cli Example project with intentional Rust errors (E0382, E0502, E0499) to test masterror-cli functionality. Excluded from workspace to avoid CI failures on intentional errors. --- Cargo.toml | 2 ++ examples/cli-test-errors/Cargo.toml | 14 ++++++++++++ examples/cli-test-errors/src/main.rs | 32 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 examples/cli-test-errors/Cargo.toml create mode 100644 examples/cli-test-errors/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index aa1688b..ac1ce5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,8 @@ members = [ "examples/sqlx-database", "examples/basic-async", ] +# cli-test-errors excluded - contains intentional compile errors for testing masterror-cli +exclude = ["examples/cli-test-errors"] resolver = "3" diff --git a/examples/cli-test-errors/Cargo.toml b/examples/cli-test-errors/Cargo.toml new file mode 100644 index 0000000..bf95436 --- /dev/null +++ b/examples/cli-test-errors/Cargo.toml @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +# This crate is EXCLUDED from workspace - it contains intentional compile errors +# for testing masterror-cli. Do not add to workspace members. + +[package] +name = "cli-test-errors" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] diff --git a/examples/cli-test-errors/src/main.rs b/examples/cli-test-errors/src/main.rs new file mode 100644 index 0000000..db7693e --- /dev/null +++ b/examples/cli-test-errors/src/main.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Test file with common Rust errors for masterror-cli testing. +//! +//! This file contains INTENTIONAL compile errors to test masterror-cli. +//! It should NOT be compiled directly - only used with `masterror check`. +//! +//! Run: `cd examples/cli-test-errors && cargo run -p masterror-cli -- check` + +// This file is excluded from normal compilation. +// See Cargo.toml `[[bin]]` section. + +fn main() { + // E0382 - Use of moved value + let s = String::from("hello"); + let s2 = s; + println!("{}", s); // error: value moved + + // E0502 - Cannot borrow as mutable (already borrowed as immutable) + let mut v = vec![1, 2, 3]; + let first = &v[0]; + v.push(4); // error: mutable borrow while immutable exists + println!("{}", first); + + // E0499 - Cannot borrow as mutable more than once + let mut x = 5; + let r1 = &mut x; + let r2 = &mut x; // error: second mutable borrow + println!("{} {}", r1, r2); +} From 3ec39d404147e80655ccdc8f250cfbc53781b43a Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 12:15:44 +0700 Subject: [PATCH 04/16] feat(cli): modular architecture and i18n support - Refactor into modules: commands, knowledge, locale, output, parser, sections - Add multi-language support (en, ru, ko) as cargo features - Add display section toggles (why, fix, link, translation) as features - Add show-original feature to optionally display compiler output - Translate full compiler error messages for non-English locales - Add pre-commit checks: actionlint, no_std compatibility --- .hooks/pre-commit | 17 + Cargo.toml | 2 +- masterror-cli/Cargo.toml | 16 + masterror-cli/src/commands.rs | 13 + masterror-cli/src/commands/check.rs | 61 +++ masterror-cli/src/commands/explain.rs | 72 +++ masterror-cli/src/commands/list.rs | 68 +++ masterror-cli/src/knowledge.rs | 208 ++++++++ masterror-cli/src/locale.rs | 78 +++ masterror-cli/src/locale/en.rs | 152 ++++++ masterror-cli/src/locale/ko.rs | 241 +++++++++ masterror-cli/src/locale/ru.rs | 297 +++++++++++ masterror-cli/src/main.rs | 585 +--------------------- masterror-cli/src/options.rs | 11 + masterror-cli/src/output.rs | 75 +++ masterror-cli/src/parser.rs | 60 +++ masterror-cli/src/sections.rs | 10 + masterror-cli/src/sections/fix.rs | 35 ++ masterror-cli/src/sections/link.rs | 32 ++ masterror-cli/src/sections/translation.rs | 34 ++ masterror-cli/src/sections/why.rs | 31 ++ 21 files changed, 1534 insertions(+), 564 deletions(-) create mode 100644 masterror-cli/src/commands.rs create mode 100644 masterror-cli/src/commands/check.rs create mode 100644 masterror-cli/src/commands/explain.rs create mode 100644 masterror-cli/src/commands/list.rs create mode 100644 masterror-cli/src/knowledge.rs create mode 100644 masterror-cli/src/locale.rs create mode 100644 masterror-cli/src/locale/en.rs create mode 100644 masterror-cli/src/locale/ko.rs create mode 100644 masterror-cli/src/locale/ru.rs create mode 100644 masterror-cli/src/options.rs create mode 100644 masterror-cli/src/output.rs create mode 100644 masterror-cli/src/parser.rs create mode 100644 masterror-cli/src/sections.rs create mode 100644 masterror-cli/src/sections/fix.rs create mode 100644 masterror-cli/src/sections/link.rs create mode 100644 masterror-cli/src/sections/translation.rs create mode 100644 masterror-cli/src/sections/why.rs diff --git a/.hooks/pre-commit b/.hooks/pre-commit index eeacd39..d20bd92 100755 --- a/.hooks/pre-commit +++ b/.hooks/pre-commit @@ -20,6 +20,23 @@ else echo " - pip: pip install reuse" fi +echo "🔧 Linting GitHub Actions..." +if command -v actionlint &> /dev/null; then + actionlint +else + echo "⚠️ Warning: actionlint not installed, skipping Actions linting" + echo " Install with:" + echo " - Arch Linux: paru -S actionlint" + echo " - Go: go install github.com/rhysd/actionlint/cmd/actionlint@latest" + echo " - Homebrew: brew install actionlint" +fi + +echo "🔒 Checking no_std compatibility..." +cargo check --no-default-features -q +cargo check --no-default-features --features tracing -q +cargo check --no-default-features --features metrics -q +cargo check --no-default-features --features colored -q + echo "🔍 Running clippy (all features, all targets)..." cargo clippy --workspace --all-targets --all-features -- -D warnings diff --git a/Cargo.toml b/Cargo.toml index ac1ce5f..b9c6165 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ members = [ "examples/sqlx-database", "examples/basic-async", ] -# cli-test-errors excluded - contains intentional compile errors for testing masterror-cli +# cli-test-errors contains intentional compile errors for testing masterror-cli exclude = ["examples/cli-test-errors"] resolver = "3" diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml index c2d54ed..a43e207 100644 --- a/masterror-cli/Cargo.toml +++ b/masterror-cli/Cargo.toml @@ -29,6 +29,22 @@ owo-colors = { version = "4", features = ["supports-colors"] } serde = { version = "1", features = ["derive"] } serde_json = "1" +[features] +default = ["show-why", "show-fix", "show-link", "show-translation"] + +# Languages (only one should be enabled, en is always available) +lang-ru = [] +lang-ko = [] + +# Display sections +show-why = [] +show-fix = [] +show-link = [] +show-translation = [] + +# Show original compiler output before masterror block +show-original = [] + [dev-dependencies] assert_cmd = "2" predicates = "3" diff --git a/masterror-cli/src/commands.rs b/masterror-cli/src/commands.rs new file mode 100644 index 0000000..29a925c --- /dev/null +++ b/masterror-cli/src/commands.rs @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! CLI commands. + +mod check; +mod explain; +mod list; + +pub use check::run as check; +pub use explain::run as explain; +pub use list::run as list; diff --git a/masterror-cli/src/commands/check.rs b/masterror-cli/src/commands/check.rs new file mode 100644 index 0000000..5907db1 --- /dev/null +++ b/masterror-cli/src/commands/check.rs @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Check command - run cargo check and explain errors. + +use std::{ + io::{BufRead, BufReader}, + process::{Command, Stdio} +}; + +use crate::{locale::Locale, options::DisplayOptions, output, parser::CargoMessage}; + +/// Run cargo check and explain errors. +pub fn run( + locale: &Locale, + args: &[String], + opts: &DisplayOptions +) -> Result<(), Box> { + let msg_format = if opts.colored { + "--message-format=json-diagnostic-rendered-ansi" + } else { + "--message-format=json" + }; + + let mut cmd = Command::new("cargo") + .arg("check") + .arg(msg_format) + .args(args) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn()?; + + let stdout = cmd.stdout.take().expect("stdout captured"); + let reader = BufReader::new(stdout); + + let mut error_count = 0; + + for line in reader.lines() { + let line = line?; + if let Ok(msg) = serde_json::from_str::(&line) + && msg.is_error() + { + error_count += 1; + output::print_error(locale, &msg, opts); + println!(); + } + } + + let status = cmd.wait()?; + + if error_count > 0 { + println!("Found {error_count} error(s). Run `masterror explain ` for details."); + } + + if !status.success() { + std::process::exit(status.code().unwrap_or(1)); + } + + Ok(()) +} diff --git a/masterror-cli/src/commands/explain.rs b/masterror-cli/src/commands/explain.rs new file mode 100644 index 0000000..788092f --- /dev/null +++ b/masterror-cli/src/commands/explain.rs @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Explain command - explain a specific error code. + +use owo_colors::OwoColorize; + +#[allow(unused_imports)] +use crate::sections; +use crate::{ + knowledge::{self, ErrorEntry}, + locale::Locale, + options::DisplayOptions +}; + +/// Explain a specific error code. +pub fn run( + locale: &Locale, + code: &str, + opts: &DisplayOptions +) -> Result<(), Box> { + let Some(entry) = knowledge::find(code) else { + eprintln!("Unknown error code: {code}"); + eprintln!("Run `masterror list` to see available codes."); + std::process::exit(1); + }; + + print_explain(locale, entry, opts); + Ok(()) +} + +fn print_explain(locale: &Locale, entry: &ErrorEntry, opts: &DisplayOptions) { + println!(); + + // Title + let title = locale.get(entry.title_key); + if opts.colored { + println!("{} - {}", entry.code.yellow().bold(), title.bold()); + } else { + println!("{} - {title}", entry.code); + } + + // Category + let cat_key = format!("category-{}", entry.category); + let category = locale.get(&cat_key); + if opts.colored { + println!("Category: {}", category.dimmed()); + } else { + println!("Category: {category}"); + } + + #[cfg(feature = "show-why")] + { + println!(); + sections::why::print(locale, entry.explanation_key, opts.colored); + } + + #[cfg(feature = "show-fix")] + if !entry.fixes.is_empty() { + println!(); + sections::fix::print(locale, entry.fixes, opts.colored); + } + + #[cfg(feature = "show-link")] + if !entry.links.is_empty() { + println!(); + sections::link::print(locale, entry.links, opts.colored); + } + + println!(); +} diff --git a/masterror-cli/src/commands/list.rs b/masterror-cli/src/commands/list.rs new file mode 100644 index 0000000..9763245 --- /dev/null +++ b/masterror-cli/src/commands/list.rs @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! List command - list all known error codes. + +use owo_colors::OwoColorize; + +use crate::{knowledge, locale::Locale, options::DisplayOptions}; + +/// List all known error codes. +pub fn run( + locale: &Locale, + category: Option<&str>, + opts: &DisplayOptions +) -> Result<(), Box> { + println!(); + if opts.colored { + println!("{}", "Known Rust Compiler Errors".bold()); + } else { + println!("Known Rust Compiler Errors"); + } + println!(); + + let entries = knowledge::entries(); + let filtered: Vec<_> = if let Some(cat) = category { + entries + .iter() + .filter(|e| e.category.eq_ignore_ascii_case(cat)) + .collect() + } else { + entries.iter().collect() + }; + + if filtered.is_empty() { + println!(" No errors found."); + return Ok(()); + } + + let mut current_cat = ""; + for entry in &filtered { + if entry.category != current_cat { + current_cat = entry.category; + println!(); + let cat_key = format!("category-{current_cat}"); + let cat_name = locale.get(&cat_key); + if opts.colored { + println!(" {}", cat_name.yellow().bold()); + } else { + println!(" {cat_name}"); + } + println!(); + } + + let title = locale.get(entry.title_key); + if opts.colored { + println!(" {} - {title}", entry.code.cyan()); + } else { + println!(" {} - {title}", entry.code); + } + } + + println!(); + println!("Total: {} errors", filtered.len()); + println!(); + + Ok(()) +} diff --git a/masterror-cli/src/knowledge.rs b/masterror-cli/src/knowledge.rs new file mode 100644 index 0000000..ad184cf --- /dev/null +++ b/masterror-cli/src/knowledge.rs @@ -0,0 +1,208 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Knowledge base for Rust compiler errors. +#![allow(dead_code)] + +/// Link with title for documentation. +pub struct DocLink { + pub title: &'static str, + pub url: &'static str +} + +/// Fix suggestion with code example. +pub struct FixSuggestion { + pub description_key: &'static str, + pub code: &'static str +} + +/// Entry in the error knowledge base. +pub struct ErrorEntry { + pub code: &'static str, + pub title_key: &'static str, + pub category: &'static str, + pub explanation_key: &'static str, + pub fixes: &'static [FixSuggestion], + pub links: &'static [DocLink] +} + +/// Get all known error entries. +pub fn entries() -> &'static [ErrorEntry] { + &[ + ErrorEntry { + code: "E0382", + title_key: "e0382-title", + category: "ownership", + explanation_key: "e0382-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0382-fix-clone-desc", + code: "let s2 = s.clone();" + }, + FixSuggestion { + description_key: "e0382-fix-borrow-desc", + code: "let s2 = &s;" + }, + FixSuggestion { + description_key: "e0382-fix-copy-desc", + code: "#[derive(Copy, Clone)]" + } + ], + links: &[ + DocLink { + title: "Rust Book: Ownership", + url: "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0382.html" + }, + DocLink { + title: "Rust By Example", + url: "https://doc.rust-lang.org/rust-by-example/scope/move.html" + } + ] + }, + ErrorEntry { + code: "E0502", + title_key: "e0502-title", + category: "borrowing", + explanation_key: "e0502-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0502-fix-scope-desc", + code: "{ let r = &x; println!(\"{}\", r); } // r dropped\nx.push(1);" + }, + FixSuggestion { + description_key: "e0502-fix-clone-desc", + code: "let first = v[0].clone(); // clone before mutation" + } + ], + links: &[ + DocLink { + title: "Rust Book: References and Borrowing", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0502.html" + } + ] + }, + ErrorEntry { + code: "E0499", + title_key: "e0499-title", + category: "borrowing", + explanation_key: "e0499-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0499-fix-scope-desc", + code: "{ let r1 = &mut x; *r1 += 1; } // r1 dropped\nlet r2 = &mut x;" + }, + FixSuggestion { + description_key: "e0499-fix-refcell-desc", + code: "use std::cell::RefCell;\nlet x = RefCell::new(value);" + } + ], + links: &[ + DocLink { + title: "Rust Book: Mutable References", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0499.html" + } + ] + }, + ErrorEntry { + code: "E0308", + title_key: "e0308-title", + category: "types", + explanation_key: "e0308-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0308-fix-convert-desc", + code: "let n: i32 = s.parse().unwrap();" + }, + FixSuggestion { + description_key: "e0308-fix-as-desc", + code: "let n = x as i32;" + } + ], + links: &[ + DocLink { + title: "Rust Book: Data Types", + url: "https://doc.rust-lang.org/book/ch03-02-data-types.html" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0308.html" + } + ] + }, + ErrorEntry { + code: "E0106", + title_key: "e0106-title", + category: "lifetimes", + explanation_key: "e0106-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0106-fix-lifetime-desc", + code: "struct Foo<'a> { x: &'a str }" + }, + FixSuggestion { + description_key: "e0106-fix-owned-desc", + code: "struct Foo { x: String }" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0106.html" + } + ] + }, + ErrorEntry { + code: "E0597", + title_key: "e0597-title", + category: "lifetimes", + explanation_key: "e0597-explanation", + fixes: &[ + FixSuggestion { + description_key: "e0597-fix-move-desc", + code: "let s = String::from(\"hello\"); // move to outer scope" + }, + FixSuggestion { + description_key: "e0597-fix-owned-desc", + code: "return s.to_string(); // return owned value" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Rust Reference", + url: "https://doc.rust-lang.org/error_codes/E0597.html" + } + ] + } + ] +} + +/// Find error entry by code. +pub fn find(code: &str) -> Option<&'static ErrorEntry> { + let normalized = if code.starts_with('E') || code.starts_with('e') { + code.to_uppercase() + } else { + format!("E{code}") + }; + entries().iter().find(|e| e.code == normalized) +} diff --git a/masterror-cli/src/locale.rs b/masterror-cli/src/locale.rs new file mode 100644 index 0000000..9a81cf0 --- /dev/null +++ b/masterror-cli/src/locale.rs @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Localization system for masterror-cli. +#![allow(dead_code)] + +mod en; +#[cfg(feature = "lang-ko")] +mod ko; +#[cfg(feature = "lang-ru")] +mod ru; + +use std::collections::HashMap; + +/// Locale with messages and error translations. +pub struct Locale { + messages: HashMap<&'static str, &'static str>, + translations: HashMap<&'static str, &'static str>, + lang: String +} + +impl Locale { + /// Create locale for given language code. + pub fn new(lang: &str) -> Self { + let (messages, translations) = match lang { + #[cfg(feature = "lang-ru")] + "ru" => (ru::messages(), ru::translations()), + #[cfg(feature = "lang-ko")] + "ko" => (ko::messages(), ko::translations()), + _ => (en::messages(), HashMap::new()) + }; + Self { + messages, + translations, + lang: lang.to_string() + } + } + + /// Get localized message by key. + pub fn get<'a>(&'a self, key: &'a str) -> &'a str { + self.messages.get(key).copied().unwrap_or(key) + } + + /// Get full translated error message by code. + pub fn translate_error(&self, error_code: &str, _original_msg: &str) -> Option<&'static str> { + if self.lang == "en" { + return None; + } + // Get full translation by error code from messages + let key = format!("{}-translation", error_code.to_lowercase()); + self.messages.get(key.as_str()).copied() + } + + /// Check if translation field should be shown. + pub fn has_translation(&self) -> bool { + self.lang != "en" + } + + /// Translate full rendered compiler output. + pub fn translate_rendered(&self, rendered: &str) -> String { + if self.lang == "en" { + return rendered.to_string(); + } + + let mut result = rendered.to_string(); + + // Sort by length descending to replace longer phrases first + let mut pairs: Vec<_> = self.translations.iter().collect(); + pairs.sort_by(|a, b| b.0.len().cmp(&a.0.len())); + + for (en, translated) in pairs { + result = result.replace(en, translated); + } + + result + } +} diff --git a/masterror-cli/src/locale/en.rs b/masterror-cli/src/locale/en.rs new file mode 100644 index 0000000..3e3583f --- /dev/null +++ b/masterror-cli/src/locale/en.rs @@ -0,0 +1,152 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! English locale. + +use std::collections::HashMap; + +pub fn messages() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + + // Labels + m.insert("label-translation", "Translation:"); + m.insert("label-why", "Why:"); + m.insert("label-fix", "Fix:"); + m.insert("label-link", "Learn more:"); + + // Categories + m.insert("category-ownership", "Ownership"); + m.insert("category-types", "Types"); + m.insert("category-lifetimes", "Lifetimes"); + m.insert("category-borrowing", "Borrowing"); + + // E0382 - Use of moved value + m.insert("e0382-title", "Use of moved value"); + m.insert( + "e0382-explanation", + "\ +In Rust, each value has exactly one owner at a time. This is the foundation +of Rust's memory safety guarantees without garbage collection. + +When you assign a value to another variable or pass it to a function, +ownership MOVES to the new location. The original variable becomes invalid +and cannot be used anymore. + +This happens because Rust needs to know exactly when to free memory. +With one owner, there's no ambiguity about who is responsible for cleanup." + ); + m.insert( + "e0382-fix-clone-desc", + "Clone the value (creates a deep copy)" + ); + m.insert( + "e0382-fix-borrow-desc", + "Borrow with a reference (no copy, shared access)" + ); + m.insert( + "e0382-fix-copy-desc", + "Implement Copy trait (for small, stack-only types)" + ); + + // E0502 - Cannot borrow as mutable (already borrowed as immutable) + m.insert( + "e0502-title", + "Cannot borrow as mutable (already borrowed as immutable)" + ); + m.insert( + "e0502-explanation", + "\ +Rust enforces a strict borrowing rule: you can have EITHER one mutable +reference OR any number of immutable references, but never both at once. + +This prevents data races at compile time. If you could mutate data while +someone else is reading it, the reader might see inconsistent state. + +The immutable borrow is still \"active\" because it's used later in code. +Rust tracks lifetimes to ensure references don't outlive their data." + ); + m.insert( + "e0502-fix-scope-desc", + "End the immutable borrow before mutating" + ); + m.insert("e0502-fix-clone-desc", "Clone the data before mutation"); + + // E0499 - Cannot borrow as mutable more than once + m.insert("e0499-title", "Cannot borrow as mutable more than once"); + m.insert( + "e0499-explanation", + "\ +Rust allows only ONE mutable reference to data at a time. This is stricter +than the immutable borrowing rule and prevents all aliased mutation. + +Why? Two mutable references to the same data could lead to: +- Data races in concurrent code +- Iterator invalidation +- Dangling pointers after reallocation + +This rule is checked at compile time, giving you fearless concurrency." + ); + m.insert( + "e0499-fix-scope-desc", + "Use scopes to limit mutable borrow lifetime" + ); + m.insert( + "e0499-fix-refcell-desc", + "Use RefCell for interior mutability (runtime checks)" + ); + + // E0308 - Mismatched types + m.insert("e0308-title", "Mismatched types"); + m.insert( + "e0308-explanation", + "\ +Rust is statically typed and does NOT perform implicit type conversions. +Every value has a specific type, and the compiler ensures type consistency. + +This catches bugs at compile time that would be runtime errors in other +languages. The type system is your friend, not an obstacle." + ); + m.insert( + "e0308-fix-convert-desc", + "Use parse() for string to number conversion" + ); + m.insert("e0308-fix-as-desc", "Use 'as' for numeric type casting"); + + // E0106 - Missing lifetime specifier + m.insert("e0106-title", "Missing lifetime specifier"); + m.insert( + "e0106-explanation", + "\ +References in Rust have lifetimes - they describe how long the reference +is valid. Usually the compiler infers lifetimes, but sometimes you must +be explicit. + +Lifetime annotations don't change how long values live. They describe +relationships between references so the compiler can verify safety." + ); + m.insert("e0106-fix-lifetime-desc", "Add explicit lifetime parameter"); + m.insert( + "e0106-fix-owned-desc", + "Use owned type instead of reference" + ); + + // E0597 - Value does not live long enough + m.insert("e0597-title", "Value does not live long enough"); + m.insert( + "e0597-explanation", + "\ +You're creating a reference to something that will be destroyed before +the reference is used. This would create a dangling pointer. + +Rust prevents this at compile time. The referenced value must live at +least as long as the reference itself." + ); + m.insert("e0597-fix-move-desc", "Move value to outer scope"); + m.insert( + "e0597-fix-owned-desc", + "Return owned value instead of reference" + ); + + m +} diff --git a/masterror-cli/src/locale/ko.rs b/masterror-cli/src/locale/ko.rs new file mode 100644 index 0000000..b275ab7 --- /dev/null +++ b/masterror-cli/src/locale/ko.rs @@ -0,0 +1,241 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Korean locale. + +use std::collections::HashMap; + +pub fn messages() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + + // Labels + m.insert("label-translation", "번역:"); + m.insert("label-why", "원인:"); + m.insert("label-fix", "해결:"); + m.insert("label-link", "링크:"); + + // Categories + m.insert("category-ownership", "소유권"); + m.insert("category-types", "타입"); + m.insert("category-lifetimes", "라이프타임"); + m.insert("category-borrowing", "빌림"); + + // E0382 - Use of moved value + m.insert("e0382-title", "이동된 값 사용"); + m.insert("e0382-translation", "이동된 값의 빌림"); + m.insert( + "e0382-explanation", + "\ +Rust에서 각 값은 정확히 하나의 소유자를 가집니다. 이것이 가비지 컬렉터 없이 +메모리 안전성을 보장하는 기반입니다. + +값을 다른 변수에 할당하거나 함수에 전달하면 소유권이 새 위치로 이동합니다. +원래 변수는 무효화되어 더 이상 사용할 수 없습니다. + +이는 Rust가 메모리를 언제 해제해야 하는지 정확히 알아야 하기 때문입니다. +소유자가 하나이면 정리 책임이 명확합니다." + ); + m.insert("e0382-fix-clone-desc", "값을 복제 (깊은 복사)"); + m.insert("e0382-fix-borrow-desc", "참조로 빌림 (복사 없음)"); + m.insert("e0382-fix-copy-desc", "Copy 트레이트 구현 (작은 타입용)"); + + // E0502 - Cannot borrow as mutable (already borrowed as immutable) + m.insert("e0502-title", "가변으로 빌릴 수 없음 (이미 불변으로 빌림)"); + m.insert( + "e0502-translation", + "이미 불변으로 빌려서 가변으로 빌릴 수 없음" + ); + m.insert( + "e0502-explanation", + "\ +Rust는 엄격한 빌림 규칙을 적용합니다: 하나의 가변 참조 또는 여러 불변 참조를 +가질 수 있지만, 동시에 둘 다 가질 수는 없습니다. + +이는 컴파일 시 데이터 경쟁을 방지합니다. 다른 사람이 읽는 동안 데이터를 +변경할 수 있다면, 읽는 사람은 일관성 없는 상태를 볼 수 있습니다. + +불변 빌림은 코드 뒤에서 사용되기 때문에 여전히 \"활성\" 상태입니다." + ); + m.insert("e0502-fix-scope-desc", "변경 전에 불변 빌림 종료"); + m.insert("e0502-fix-clone-desc", "변경 전에 데이터 복제"); + + // E0499 - Cannot borrow as mutable more than once + m.insert("e0499-title", "가변으로 두 번 이상 빌릴 수 없음"); + m.insert( + "e0499-translation", + "동시에 가변으로 두 번 이상 빌릴 수 없음" + ); + m.insert( + "e0499-explanation", + "\ +Rust는 데이터에 대해 한 번에 하나의 가변 참조만 허용합니다. +이는 불변 빌림 규칙보다 엄격하며 모든 별명 변경을 방지합니다. + +왜? 동일한 데이터에 대한 두 개의 가변 참조는 다음을 초래할 수 있습니다: +- 동시 코드에서 데이터 경쟁 +- 반복자 무효화 +- 재할당 후 댕글링 포인터 + +이 규칙은 컴파일 시 확인되어 fearless concurrency를 제공합니다." + ); + m.insert("e0499-fix-scope-desc", "스코프를 사용하여 빌림 수명 제한"); + m.insert( + "e0499-fix-refcell-desc", + "내부 가변성을 위해 RefCell 사용 (런타임 검사)" + ); + + // E0308 - Mismatched types + m.insert("e0308-title", "타입 불일치"); + m.insert("e0308-translation", "타입 불일치"); + m.insert( + "e0308-explanation", + "\ +Rust는 정적 타입 언어이며 암시적 타입 변환을 수행하지 않습니다. +모든 값에는 특정 타입이 있으며 컴파일러가 타입 일관성을 보장합니다. + +이는 다른 언어에서 런타임 오류가 될 버그를 컴파일 시 잡습니다. +타입 시스템은 장애물이 아니라 친구입니다." + ); + m.insert( + "e0308-fix-convert-desc", + "문자열을 숫자로 변환하려면 parse() 사용" + ); + m.insert("e0308-fix-as-desc", "숫자 타입 캐스팅에 'as' 사용"); + + // E0106 - Missing lifetime specifier + m.insert("e0106-title", "라이프타임 지정자 누락"); + m.insert("e0106-translation", "라이프타임 지정자 누락"); + m.insert( + "e0106-explanation", + "\ +Rust의 참조에는 라이프타임이 있습니다 - 참조가 얼마나 오래 유효한지 설명합니다. +보통 컴파일러가 라이프타임을 추론하지만, 때로는 명시해야 합니다. + +라이프타임 어노테이션은 값이 얼마나 오래 사는지 변경하지 않습니다. +컴파일러가 안전성을 확인할 수 있도록 참조 간의 관계를 설명합니다." + ); + m.insert("e0106-fix-lifetime-desc", "명시적 라이프타임 매개변수 추가"); + m.insert("e0106-fix-owned-desc", "참조 대신 소유 타입 사용"); + + // E0597 - Value does not live long enough + m.insert("e0597-title", "값이 충분히 오래 살지 않음"); + m.insert("e0597-translation", "값이 충분히 오래 살지 않음"); + m.insert( + "e0597-explanation", + "\ +참조가 사용되기 전에 파괴될 것에 대한 참조를 만들고 있습니다. +이는 댕글링 포인터를 생성합니다. + +Rust는 컴파일 시 이를 방지합니다. 참조되는 값은 적어도 참조 자체만큼 +오래 살아야 합니다." + ); + m.insert("e0597-fix-move-desc", "값을 외부 스코프로 이동"); + m.insert("e0597-fix-owned-desc", "참조 대신 소유 값 반환"); + + m +} + +pub fn translations() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + + // Error headers + m.insert("error", "오류"); + m.insert("warning", "경고"); + m.insert("note", "참고"); + m.insert("help", "도움말"); + + // E0382 - borrow of moved value + m.insert("borrow of moved value", "이동된 값의 빌림"); + m.insert("move occurs because", "이동이 발생하는 이유:"); + m.insert( + "which does not implement the `Copy` trait", + "`Copy` 트레이트를 구현하지 않음" + ); + m.insert("value moved here", "값이 여기서 이동됨"); + m.insert( + "value borrowed here after move", + "이동 후 여기서 값이 빌림됨" + ); + m.insert( + "consider cloning the value if the performance cost is acceptable", + "성능 비용이 허용되면 값을 복제하는 것을 고려하세요" + ); + + // E0502 - cannot borrow as mutable + m.insert("cannot borrow", "빌릴 수 없음"); + m.insert( + "as mutable because it is also borrowed as immutable", + "가변으로 (이미 불변으로 빌림)" + ); + m.insert("immutable borrow occurs here", "불변 빌림이 여기서 발생"); + m.insert("mutable borrow occurs here", "가변 빌림이 여기서 발생"); + m.insert( + "immutable borrow later used here", + "불변 빌림이 여기서 나중에 사용됨" + ); + + // E0499 - cannot borrow as mutable more than once + m.insert( + "as mutable more than once at a time", + "동시에 가변으로 두 번 이상" + ); + m.insert( + "first mutable borrow occurs here", + "첫 번째 가변 빌림이 여기서 발생" + ); + m.insert( + "second mutable borrow occurs here", + "두 번째 가변 빌림이 여기서 발생" + ); + m.insert( + "first borrow later used here", + "첫 번째 빌림이 여기서 나중에 사용됨" + ); + + // E0308 - mismatched types + m.insert("mismatched types", "타입 불일치"); + m.insert("expected", "예상"); + m.insert("found", "발견"); + m.insert("expected type", "예상 타입"); + m.insert("found type", "발견된 타입"); + m.insert("this expression has type", "이 표현식의 타입:"); + + // E0106 - missing lifetime + m.insert("missing lifetime specifier", "라이프타임 지정자 누락"); + m.insert( + "expected named lifetime parameter", + "명명된 라이프타임 매개변수 예상" + ); + + // E0597 - does not live long enough + m.insert("does not live long enough", "충분히 오래 살지 않음"); + m.insert( + "borrowed value does not live long enough", + "빌린 값이 충분히 오래 살지 않음" + ); + m.insert( + "dropped here while still borrowed", + "아직 빌린 상태에서 여기서 삭제됨" + ); + + // Common phrases + m.insert("has type", "타입을 가짐"); + m.insert("consider", "고려하세요"); + m.insert( + "this error originates in the macro", + "이 오류는 매크로에서 발생" + ); + m.insert("run with", "실행:"); + m.insert( + "for more info about this issue", + "이 문제에 대한 자세한 정보" + ); + m.insert("aborting due to", "중단 원인:"); + m.insert("previous error", "이전 오류"); + m.insert("previous errors", "이전 오류들"); + m.insert("could not compile", "컴파일 실패"); + m.insert("due to", "원인:"); + + m +} diff --git a/masterror-cli/src/locale/ru.rs b/masterror-cli/src/locale/ru.rs new file mode 100644 index 0000000..83d507b --- /dev/null +++ b/masterror-cli/src/locale/ru.rs @@ -0,0 +1,297 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Russian locale. + +use std::collections::HashMap; + +pub fn messages() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + + // Labels + m.insert("label-translation", "Перевод:"); + m.insert("label-why", "Причина:"); + m.insert("label-fix", "Решение:"); + m.insert("label-link", "Ссылки:"); + + // Categories + m.insert("category-ownership", "Владение"); + m.insert("category-types", "Типы"); + m.insert("category-lifetimes", "Времена жизни"); + m.insert("category-borrowing", "Заимствование"); + + // E0382 - Use of moved value + m.insert("e0382-title", "Использование перемещённого значения"); + m.insert("e0382-translation", "заимствование перемещённого значения"); + m.insert( + "e0382-explanation", + "\ +В Rust у каждого значения ровно один владелец в каждый момент времени. +Это основа гарантий безопасности памяти без сборщика мусора. + +Когда вы присваиваете значение другой переменной или передаёте в функцию, +владение ПЕРЕМЕЩАЕТСЯ в новое место. Исходная переменная становится +недействительной и не может использоваться. + +Это происходит потому, что Rust должен точно знать, когда освобождать память. +С одним владельцем нет неоднозначности в том, кто отвечает за очистку." + ); + m.insert( + "e0382-fix-clone-desc", + "Клонировать значение (глубокое копирование)" + ); + m.insert( + "e0382-fix-borrow-desc", + "Заимствовать через ссылку (без копирования)" + ); + m.insert( + "e0382-fix-copy-desc", + "Реализовать трейт Copy (для маленьких типов)" + ); + + // E0502 - Cannot borrow as mutable (already borrowed as immutable) + m.insert( + "e0502-title", + "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)" + ); + m.insert( + "e0502-translation", + "нельзя заимствовать как изменяемое, т.к. уже заимствовано как неизменяемое" + ); + m.insert( + "e0502-explanation", + "\ +Rust применяет строгое правило заимствования: можно иметь ЛИБО одну +изменяемую ссылку, ЛИБО любое количество неизменяемых, но никогда оба сразу. + +Это предотвращает гонки данных на этапе компиляции. Если бы можно было +изменять данные, пока кто-то их читает, читатель мог бы увидеть +несогласованное состояние. + +Неизменяемое заимствование всё ещё \"активно\", потому что используется +дальше в коде. Rust отслеживает времена жизни ссылок." + ); + m.insert( + "e0502-fix-scope-desc", + "Завершить неизменяемое заимствование перед мутацией" + ); + m.insert("e0502-fix-clone-desc", "Клонировать данные перед мутацией"); + + // E0499 - Cannot borrow as mutable more than once + m.insert( + "e0499-title", + "Нельзя заимствовать как изменяемое больше одного раза" + ); + m.insert( + "e0499-translation", + "нельзя заимствовать как изменяемое больше одного раза одновременно" + ); + m.insert( + "e0499-explanation", + "\ +Rust разрешает только ОДНУ изменяемую ссылку на данные одновременно. +Это строже правила неизменяемого заимствования и предотвращает любую +мутацию через алиасы. + +Почему? Две изменяемые ссылки на одни данные могут привести к: +- Гонкам данных в параллельном коде +- Инвалидации итераторов +- Висячим указателям после реаллокации + +Это правило проверяется на этапе компиляции, давая вам fearless concurrency." + ); + m.insert( + "e0499-fix-scope-desc", + "Использовать области видимости для ограничения времени жизни ссылки" + ); + m.insert( + "e0499-fix-refcell-desc", + "Использовать RefCell для interior mutability (проверки в рантайме)" + ); + + // E0308 - Mismatched types + m.insert("e0308-title", "Несовпадение типов"); + m.insert("e0308-translation", "несовпадение типов"); + m.insert( + "e0308-explanation", + "\ +Rust — статически типизированный язык, который НЕ выполняет неявные +преобразования типов. Каждое значение имеет конкретный тип, и компилятор +обеспечивает согласованность типов. + +Это ловит ошибки на этапе компиляции, которые были бы ошибками времени +выполнения в других языках. Система типов — ваш друг, а не препятствие." + ); + m.insert( + "e0308-fix-convert-desc", + "Использовать parse() для преобразования строки в число" + ); + m.insert( + "e0308-fix-as-desc", + "Использовать 'as' для приведения числовых типов" + ); + + // E0106 - Missing lifetime specifier + m.insert("e0106-title", "Отсутствует спецификатор времени жизни"); + m.insert( + "e0106-translation", + "отсутствует спецификатор времени жизни" + ); + m.insert( + "e0106-explanation", + "\ +Ссылки в Rust имеют времена жизни — они описывают, как долго ссылка валидна. +Обычно компилятор выводит времена жизни сам, но иногда нужно указать явно. + +Аннотации времён жизни не изменяют то, как долго живут значения. Они +описывают связи между ссылками, чтобы компилятор мог проверить безопасность." + ); + m.insert( + "e0106-fix-lifetime-desc", + "Добавить явный параметр времени жизни" + ); + m.insert( + "e0106-fix-owned-desc", + "Использовать владеющий тип вместо ссылки" + ); + + // E0597 - Value does not live long enough + m.insert("e0597-title", "Значение живёт недостаточно долго"); + m.insert("e0597-translation", "значение живёт недостаточно долго"); + m.insert( + "e0597-explanation", + "\ +Вы создаёте ссылку на что-то, что будет уничтожено до того, как ссылка +будет использована. Это создало бы висячий указатель. + +Rust предотвращает это на этапе компиляции. Значение, на которое ссылаются, +должно жить как минимум столько же, сколько сама ссылка." + ); + m.insert( + "e0597-fix-move-desc", + "Переместить значение во внешнюю область видимости" + ); + m.insert( + "e0597-fix-owned-desc", + "Вернуть владеющее значение вместо ссылки" + ); + + m +} + +pub fn translations() -> HashMap<&'static str, &'static str> { + let mut m = HashMap::new(); + + // Error headers + m.insert("error", "ошибка"); + m.insert("warning", "предупреждение"); + m.insert("note", "примечание"); + m.insert("help", "подсказка"); + + // E0382 - borrow of moved value + m.insert( + "borrow of moved value", + "заимствование перемещённого значения" + ); + m.insert("move occurs because", "перемещение происходит потому что"); + m.insert( + "which does not implement the `Copy` trait", + "который не реализует трейт `Copy`" + ); + m.insert("value moved here", "значение перемещено здесь"); + m.insert( + "value borrowed here after move", + "значение заимствовано здесь после перемещения" + ); + m.insert( + "consider cloning the value if the performance cost is acceptable", + "рассмотрите клонирование значения, если допустима потеря производительности" + ); + + // E0502 - cannot borrow as mutable + m.insert("cannot borrow", "нельзя заимствовать"); + m.insert( + "as mutable because it is also borrowed as immutable", + "как изменяемое, т.к. уже заимствовано как неизменяемое" + ); + m.insert( + "immutable borrow occurs here", + "неизменяемое заимствование здесь" + ); + m.insert( + "mutable borrow occurs here", + "изменяемое заимствование здесь" + ); + m.insert( + "immutable borrow later used here", + "неизменяемое заимствование используется здесь" + ); + + // E0499 - cannot borrow as mutable more than once + m.insert( + "as mutable more than once at a time", + "как изменяемое больше одного раза одновременно" + ); + m.insert( + "first mutable borrow occurs here", + "первое изменяемое заимствование здесь" + ); + m.insert( + "second mutable borrow occurs here", + "второе изменяемое заимствование здесь" + ); + m.insert( + "first borrow later used here", + "первое заимствование используется здесь" + ); + + // E0308 - mismatched types + m.insert("mismatched types", "несовпадение типов"); + m.insert("expected", "ожидается"); + m.insert("found", "найдено"); + m.insert("expected type", "ожидаемый тип"); + m.insert("found type", "найденный тип"); + m.insert("this expression has type", "это выражение имеет тип"); + + // E0106 - missing lifetime + m.insert( + "missing lifetime specifier", + "отсутствует спецификатор времени жизни" + ); + m.insert( + "expected named lifetime parameter", + "ожидается именованный параметр времени жизни" + ); + + // E0597 - does not live long enough + m.insert("does not live long enough", "живёт недостаточно долго"); + m.insert( + "borrowed value does not live long enough", + "заимствованное значение живёт недостаточно долго" + ); + m.insert( + "dropped here while still borrowed", + "удалено здесь, пока ещё заимствовано" + ); + + // Common phrases + m.insert("has type", "имеет тип"); + m.insert("consider", "рассмотрите"); + m.insert( + "this error originates in the macro", + "эта ошибка возникла в макросе" + ); + m.insert("run with", "запустите с"); + m.insert( + "for more info about this issue", + "для информации об этой ошибке" + ); + m.insert("aborting due to", "прерывание из-за"); + m.insert("previous error", "предыдущей ошибки"); + m.insert("previous errors", "предыдущих ошибок"); + m.insert("could not compile", "не удалось скомпилировать"); + m.insert("due to", "из-за"); + + m +} diff --git a/masterror-cli/src/main.rs b/masterror-cli/src/main.rs index 3c9eed8..9280306 100644 --- a/masterror-cli/src/main.rs +++ b/masterror-cli/src/main.rs @@ -4,26 +4,23 @@ //! masterror CLI - Rust compiler error explainer. -use std::{ - collections::HashMap, - io::{BufRead, BufReader}, - process::{Command, Stdio} -}; +mod commands; +mod knowledge; +mod locale; +mod options; +mod output; +mod parser; +mod sections; use clap::{Parser, Subcommand}; -use owo_colors::OwoColorize; -use serde::Deserialize; -// ───────────────────────────────────────────────────────────────────────────── -// CLI Definition -// ───────────────────────────────────────────────────────────────────────────── +use crate::{locale::Locale, options::DisplayOptions}; -#[derive(Parser, Debug)] +#[derive(Parser)] #[command(name = "masterror")] #[command(author, version, about = "Rust compiler error explainer")] -#[command(propagate_version = true)] struct Cli { - /// Language for explanations (en, ru) + /// Language for explanations (en, ru, ko) #[arg(short, long, env = "MASTERROR_LANG", default_value = "en")] lang: String, @@ -35,7 +32,7 @@ struct Cli { command: Commands } -#[derive(Subcommand, Debug)] +#[derive(Subcommand)] enum Commands { /// Run cargo check and explain errors Check { @@ -51,565 +48,27 @@ enum Commands { } } -// ───────────────────────────────────────────────────────────────────────────── -// Localization -// ───────────────────────────────────────────────────────────────────────────── - -struct Locale { - messages: HashMap<&'static str, &'static str> -} - -impl Locale { - fn new(lang: &str) -> Self { - let messages = match lang { - "ru" => Self::russian(), - _ => Self::english() - }; - Self { - messages - } - } - - fn get(&self, key: &'static str) -> &'static str { - self.messages.get(key).copied().unwrap_or(key) - } - - fn english() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - m.insert("label-why", "📖 Why?"); - m.insert("label-fix", "💡 How to fix?"); - m.insert("label-link", "🔗 Learn more:"); - m.insert("label-example", "📝 Example:"); - m.insert("category-ownership", "Ownership"); - m.insert("category-types", "Types"); - m.insert("category-lifetimes", "Lifetimes"); - m.insert("category-borrowing", "Borrowing"); - - // E0382 - m.insert("e0382-title", "Use of moved value"); - m.insert("e0382-explanation", "In Rust, each value has exactly one owner. When you assign\n a value to another variable, ownership MOVES. The original\n variable becomes invalid and cannot be used anymore."); - m.insert("e0382-fix-clone", "Clone the value: let s2 = s.clone();"); - m.insert("e0382-fix-borrow", "Borrow with reference: let s2 = &s;"); - - // E0308 - m.insert("e0308-title", "Mismatched types"); - m.insert("e0308-explanation", "Rust is statically typed. You're using a value of one type\n where a different type is expected. Rust doesn't do automatic\n type conversion."); - m.insert("e0308-fix-type", "Change the type annotation to match"); - m.insert( - "e0308-fix-convert", - "Convert using .parse(), .into(), or as" - ); - - // E0502 - m.insert( - "e0502-title", - "Cannot borrow as mutable (already borrowed as immutable)" - ); - m.insert("e0502-explanation", "Rust's rule: you can have ONE mutable reference OR any number\n of immutable references, but not both at the same time."); - m.insert( - "e0502-fix", - "End the immutable borrow before creating a mutable one" - ); - - // E0499 - m.insert("e0499-title", "Cannot borrow as mutable more than once"); - m.insert( - "e0499-explanation", - "You can only have one mutable reference at a time.\n This prevents data races." - ); - m.insert( - "e0499-fix", - "Use scopes to ensure only one mutable borrow exists" - ); - - // E0106 - m.insert("e0106-title", "Missing lifetime specifier"); - m.insert("e0106-explanation", "References in structs need lifetime annotations.\n They tell the compiler how long the reference is valid."); - m.insert( - "e0106-fix-lifetime", - "Add lifetime: struct Foo<'a> { x: &'a str }" - ); - m.insert("e0106-fix-owned", "Use owned type: String instead of &str"); - - // E0597 - m.insert("e0597-title", "Value does not live long enough"); - m.insert("e0597-explanation", "You're creating a reference to something that will be\n destroyed before the reference is used."); - m.insert( - "e0597-fix", - "Move the value to a scope where it lives long enough" - ); - - m - } - - fn russian() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - m.insert("label-why", "📖 Почему?"); - m.insert("label-fix", "💡 Как исправить?"); - m.insert("label-link", "🔗 Подробнее:"); - m.insert("label-example", "📝 Пример:"); - m.insert("category-ownership", "Владение (Ownership)"); - m.insert("category-types", "Типы"); - m.insert("category-lifetimes", "Времена жизни (Lifetimes)"); - m.insert("category-borrowing", "Заимствование (Borrowing)"); - - // E0382 - m.insert("e0382-title", "Использование перемещённого значения"); - m.insert("e0382-explanation", "В Rust у каждого значения один владелец. Когда ты присваиваешь\n значение другой переменной, владение ПЕРЕМЕЩАЕТСЯ. Старая\n переменная становится недействительной."); - m.insert("e0382-fix-clone", "Клонируй: let s2 = s.clone();"); - m.insert("e0382-fix-borrow", "Заимствуй: let s2 = &s;"); - - // E0308 - m.insert("e0308-title", "Несовпадение типов"); - m.insert("e0308-explanation", "Rust статически типизирован. Ты используешь значение одного\n типа там, где ожидается другой. Rust не делает автоматическое\n преобразование типов."); - m.insert("e0308-fix-type", "Измени аннотацию типа"); - m.insert( - "e0308-fix-convert", - "Преобразуй через .parse(), .into() или as" - ); - - // E0502 - m.insert( - "e0502-title", - "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)" - ); - m.insert("e0502-explanation", "Правило Rust: можно иметь ОДНУ изменяемую ссылку ИЛИ любое\n количество неизменяемых, но не оба одновременно."); - m.insert( - "e0502-fix", - "Заверши неизменяемое заимствование перед созданием изменяемого" - ); - - // E0499 - m.insert( - "e0499-title", - "Нельзя заимствовать как изменяемое больше одного раза" - ); - m.insert("e0499-explanation", "Можно иметь только одну изменяемую ссылку одновременно.\n Это предотвращает гонки данных."); - m.insert( - "e0499-fix", - "Используй области видимости для одного изменяемого заимствования" - ); - - // E0106 - m.insert("e0106-title", "Отсутствует спецификатор времени жизни"); - m.insert("e0106-explanation", "Ссылки в структурах требуют аннотации времени жизни.\n Они говорят компилятору, как долго ссылка валидна."); - m.insert( - "e0106-fix-lifetime", - "Добавь время жизни: struct Foo<'a> { x: &'a str }" - ); - m.insert( - "e0106-fix-owned", - "Используй владеющий тип: String вместо &str" - ); - - // E0597 - m.insert("e0597-title", "Значение живёт недостаточно долго"); - m.insert( - "e0597-explanation", - "Ты создаёшь ссылку на что-то, что будет уничтожено\n до использования ссылки." - ); - m.insert( - "e0597-fix", - "Перемести значение туда, где оно живёт достаточно долго" - ); - - m - } -} - -// ───────────────────────────────────────────────────────────────────────────── -// Knowledge Base -// ───────────────────────────────────────────────────────────────────────────── - -struct ErrorEntry { - code: &'static str, - title_key: &'static str, - category: &'static str, - explanation_key: &'static str, - fixes: Vec<&'static str>, - doc_url: &'static str -} - -fn get_knowledge_base() -> Vec { - vec![ - ErrorEntry { - code: "E0382", - title_key: "e0382-title", - category: "ownership", - explanation_key: "e0382-explanation", - fixes: vec!["e0382-fix-clone", "e0382-fix-borrow"], - doc_url: "https://doc.rust-lang.org/error_codes/E0382.html" - }, - ErrorEntry { - code: "E0308", - title_key: "e0308-title", - category: "types", - explanation_key: "e0308-explanation", - fixes: vec!["e0308-fix-type", "e0308-fix-convert"], - doc_url: "https://doc.rust-lang.org/error_codes/E0308.html" - }, - ErrorEntry { - code: "E0502", - title_key: "e0502-title", - category: "borrowing", - explanation_key: "e0502-explanation", - fixes: vec!["e0502-fix"], - doc_url: "https://doc.rust-lang.org/error_codes/E0502.html" - }, - ErrorEntry { - code: "E0499", - title_key: "e0499-title", - category: "borrowing", - explanation_key: "e0499-explanation", - fixes: vec!["e0499-fix"], - doc_url: "https://doc.rust-lang.org/error_codes/E0499.html" - }, - ErrorEntry { - code: "E0106", - title_key: "e0106-title", - category: "lifetimes", - explanation_key: "e0106-explanation", - fixes: vec!["e0106-fix-lifetime", "e0106-fix-owned"], - doc_url: "https://doc.rust-lang.org/error_codes/E0106.html" - }, - ErrorEntry { - code: "E0597", - title_key: "e0597-title", - category: "lifetimes", - explanation_key: "e0597-explanation", - fixes: vec!["e0597-fix"], - doc_url: "https://doc.rust-lang.org/error_codes/E0597.html" - }, - ] -} - -// ───────────────────────────────────────────────────────────────────────────── -// Cargo JSON Parser -// ───────────────────────────────────────────────────────────────────────────── - -#[derive(Deserialize)] -struct CargoMessage { - reason: String, - message: Option -} - -#[derive(Deserialize)] -struct DiagnosticMessage { - level: String, - message: String, - code: Option, - spans: Vec -} - -#[derive(Deserialize)] -struct DiagnosticCode { - code: String -} - -#[derive(Deserialize)] -struct DiagnosticSpan { - file_name: String, - line_start: usize, - column_start: usize, - is_primary: bool -} - -// ───────────────────────────────────────────────────────────────────────────── -// Commands -// ───────────────────────────────────────────────────────────────────────────── - -fn cmd_check( - locale: &Locale, - args: &[String], - colored: bool -) -> Result<(), Box> { - let mut cmd = Command::new("cargo") - .arg("check") - .arg("--message-format=json") - .args(args) - .stdout(Stdio::piped()) - .stderr(Stdio::inherit()) - .spawn()?; - - let stdout = cmd.stdout.take().expect("stdout captured"); - let reader = BufReader::new(stdout); - let kb = get_knowledge_base(); - - let mut error_count = 0; - - for line in reader.lines() { - let line = line?; - if let Ok(msg) = serde_json::from_str::(&line) - && msg.reason == "compiler-message" - && let Some(diag) = msg.message - && diag.level == "error" - { - error_count += 1; - print_error(locale, &kb, &diag, colored); - } - } - - let status = cmd.wait()?; - - if error_count > 0 { - println!(); - println!( - "Found {} error(s). Run `masterror explain ` for details.", - error_count - ); - } - - if !status.success() { - std::process::exit(status.code().unwrap_or(1)); - } - - Ok(()) -} - -fn print_error(locale: &Locale, kb: &[ErrorEntry], diag: &DiagnosticMessage, colored: bool) { - println!(); - - let code_str = diag - .code - .as_ref() - .map(|c| c.code.as_str()) - .unwrap_or("unknown"); - - // Header - if colored { - println!("{} {}", "❌".red(), code_str.red().bold()); - } else { - println!("❌ {}", code_str); - } - - println!(" {}", diag.message); - - // Location - for span in diag.spans.iter().filter(|s| s.is_primary) { - if colored { - println!( - " {} {}:{}:{}", - "-->".blue(), - span.file_name, - span.line_start, - span.column_start - ); - } else { - println!( - " --> {}:{}:{}", - span.file_name, span.line_start, span.column_start - ); - } - } - - // Knowledge base lookup - if let Some(code) = &diag.code - && let Some(entry) = kb.iter().find(|e| e.code == code.code) - { - println!(); - let why = locale.get("label-why"); - if colored { - println!("{}", why.yellow().bold()); - } else { - println!("{}", why); - } - println!(" {}", locale.get(entry.explanation_key)); - - if !entry.fixes.is_empty() { - println!(); - let fix = locale.get("label-fix"); - if colored { - println!("{}", fix.green().bold()); - } else { - println!("{}", fix); - } - for fix_key in &entry.fixes { - println!(" • {}", locale.get(fix_key)); - } - } - - println!(); - let link = locale.get("label-link"); - if colored { - println!("{} {}", link.cyan(), entry.doc_url.underline().cyan()); - } else { - println!("{} {}", link, entry.doc_url); - } - } -} - -fn cmd_explain( - locale: &Locale, - code: &str, - colored: bool -) -> Result<(), Box> { - let kb = get_knowledge_base(); - - // Normalize code - let normalized = if code.starts_with('E') || code.starts_with('e') { - code.to_uppercase() - } else { - format!("E{}", code) - }; - - let Some(entry) = kb.iter().find(|e| e.code == normalized) else { - eprintln!("Unknown error code: {}", normalized); - eprintln!("Run `masterror list` to see available codes."); - std::process::exit(1); - }; - - println!(); - - // Title - let title = locale.get(entry.title_key); - if colored { - println!( - "{} {} - {}", - "📖".yellow(), - normalized.yellow().bold(), - title.bold() - ); - } else { - println!("📖 {} - {}", normalized, title); - } - - // Category - println!(); - let cat_key = format!("category-{}", entry.category); - let category = get_category_name(locale, &cat_key); - if colored { - println!("Category: {}", category.dimmed()); - } else { - println!("Category: {}", category); - } - - // Explanation - println!(); - let why = locale.get("label-why"); - if colored { - println!("{}", why.yellow().bold()); - } else { - println!("{}", why); - } - println!(" {}", locale.get(entry.explanation_key)); - - // Fixes - if !entry.fixes.is_empty() { - println!(); - let fix = locale.get("label-fix"); - if colored { - println!("{}", fix.green().bold()); - } else { - println!("{}", fix); - } - for fix_key in &entry.fixes { - println!(" • {}", locale.get(fix_key)); - } - } - - // Link - println!(); - let link = locale.get("label-link"); - if colored { - println!("{} {}", link.cyan(), entry.doc_url.underline().cyan()); - } else { - println!("{} {}", link, entry.doc_url); - } - - println!(); - Ok(()) -} - -fn get_category_name(locale: &Locale, key: &str) -> &'static str { - match key { - "category-ownership" => locale.get("category-ownership"), - "category-types" => locale.get("category-types"), - "category-lifetimes" => locale.get("category-lifetimes"), - "category-borrowing" => locale.get("category-borrowing"), - _ => "Unknown" - } -} - -fn cmd_list( - locale: &Locale, - category: Option<&str>, - colored: bool -) -> Result<(), Box> { - let kb = get_knowledge_base(); - - println!(); - if colored { - println!("{}", "Known Rust Compiler Errors".bold()); - } else { - println!("Known Rust Compiler Errors"); - } - println!(); - - let filtered: Vec<_> = if let Some(cat) = category { - kb.iter() - .filter(|e| e.category.eq_ignore_ascii_case(cat)) - .collect() - } else { - kb.iter().collect() - }; - - if filtered.is_empty() { - println!(" No errors found."); - return Ok(()); - } - - let mut current_cat = ""; - for entry in &filtered { - if entry.category != current_cat { - current_cat = entry.category; - println!(); - let cat_name = get_category_name(locale, &format!("category-{}", current_cat)); - if colored { - println!(" {}", cat_name.yellow().bold()); - } else { - println!(" {}", cat_name); - } - println!(); - } - - let title = locale.get(entry.title_key); - if colored { - println!(" {} - {}", entry.code.cyan(), title); - } else { - println!(" {} - {}", entry.code, title); - } - } - - println!(); - println!("Total: {} errors", filtered.len()); - println!(); - - Ok(()) -} - -// ───────────────────────────────────────────────────────────────────────────── -// Main -// ───────────────────────────────────────────────────────────────────────────── - fn main() { let cli = Cli::parse(); let locale = Locale::new(&cli.lang); - let colored = !cli.no_color; + let opts = DisplayOptions { + colored: !cli.no_color + }; - let result = match cli.command { + let result = match &cli.command { Commands::Check { - ref args - } => cmd_check(&locale, args, colored), + args + } => commands::check(&locale, args, &opts), Commands::Explain { - ref code - } => cmd_explain(&locale, code, colored), + code + } => commands::explain(&locale, code, &opts), Commands::List { - ref category - } => cmd_list(&locale, category.as_deref(), colored) + category + } => commands::list(&locale, category.as_deref(), &opts) }; if let Err(e) = result { - eprintln!("Error: {}", e); + eprintln!("Error: {e}"); std::process::exit(1); } } diff --git a/masterror-cli/src/options.rs b/masterror-cli/src/options.rs new file mode 100644 index 0000000..be666d0 --- /dev/null +++ b/masterror-cli/src/options.rs @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Display options for masterror output. + +/// What sections to show in masterror block. +#[derive(Clone, Copy)] +pub struct DisplayOptions { + pub colored: bool +} diff --git a/masterror-cli/src/output.rs b/masterror-cli/src/output.rs new file mode 100644 index 0000000..aef10a4 --- /dev/null +++ b/masterror-cli/src/output.rs @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Terminal output formatting for errors. + +use owo_colors::OwoColorize; + +#[allow(unused_imports)] +use crate::sections; +use crate::{ + knowledge::{self, ErrorEntry}, + locale::Locale, + options::DisplayOptions, + parser::CargoMessage +}; + +const SEPARATOR: &str = "--- masterror ----------------------------------------"; +const SEPARATOR_END: &str = "------------------------------------------------------"; + +/// Print error with masterror explanation. +pub fn print_error(locale: &Locale, msg: &CargoMessage, opts: &DisplayOptions) { + let rendered = msg.rendered_output(); + + #[cfg(feature = "show-original")] + if let Some(r) = rendered { + print!("{}", r.trim_end()); + } + + let Some(code) = msg.error_code() else { + #[cfg(feature = "show-original")] + println!(); + return; + }; + let Some(entry) = knowledge::find(code) else { + #[cfg(feature = "show-original")] + println!(); + return; + }; + + println!(); + print_block(locale, entry, msg.error_message(), rendered, opts); +} + +fn print_block( + locale: &Locale, + entry: &ErrorEntry, + #[allow(unused_variables)] error_msg: Option<&str>, + #[allow(unused_variables)] rendered: Option<&str>, + opts: &DisplayOptions +) { + if opts.colored { + println!("{}", SEPARATOR.dimmed()); + } else { + println!("{SEPARATOR}"); + } + + #[cfg(feature = "show-translation")] + sections::translation::print(locale, entry.code, rendered, opts.colored); + + #[cfg(feature = "show-why")] + sections::why::print(locale, entry.explanation_key, opts.colored); + + #[cfg(feature = "show-fix")] + sections::fix::print(locale, entry.fixes, opts.colored); + + #[cfg(feature = "show-link")] + sections::link::print(locale, entry.links, opts.colored); + + if opts.colored { + println!("{}", SEPARATOR_END.dimmed()); + } else { + println!("{SEPARATOR_END}"); + } +} diff --git a/masterror-cli/src/parser.rs b/masterror-cli/src/parser.rs new file mode 100644 index 0000000..fac1f9c --- /dev/null +++ b/masterror-cli/src/parser.rs @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Cargo JSON output parser. + +use serde::Deserialize; + +/// Top-level cargo message. +#[derive(Deserialize)] +pub struct CargoMessage { + pub reason: String, + pub message: Option, + /// Full rendered compiler output. + pub rendered: Option +} + +/// Compiler diagnostic message. +#[derive(Deserialize)] +pub struct DiagnosticMessage { + pub level: String, + pub message: String, + pub code: Option, + pub rendered: Option +} + +/// Error code info. +#[derive(Deserialize)] +pub struct DiagnosticCode { + pub code: String +} + +impl CargoMessage { + /// Check if this is a compiler error message. + pub fn is_error(&self) -> bool { + self.reason == "compiler-message" + && self.message.as_ref().is_some_and(|m| m.level == "error") + } + + /// Get the error code if present. + pub fn error_code(&self) -> Option<&str> { + self.message + .as_ref() + .and_then(|m| m.code.as_ref()) + .map(|c| c.code.as_str()) + } + + /// Get the error message. + pub fn error_message(&self) -> Option<&str> { + self.message.as_ref().map(|m| m.message.as_str()) + } + + /// Get rendered output (from message or top-level). + pub fn rendered_output(&self) -> Option<&str> { + self.message + .as_ref() + .and_then(|m| m.rendered.as_deref()) + .or(self.rendered.as_deref()) + } +} diff --git a/masterror-cli/src/sections.rs b/masterror-cli/src/sections.rs new file mode 100644 index 0000000..1e02b0f --- /dev/null +++ b/masterror-cli/src/sections.rs @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Output sections for masterror block. + +pub mod fix; +pub mod link; +pub mod translation; +pub mod why; diff --git a/masterror-cli/src/sections/fix.rs b/masterror-cli/src/sections/fix.rs new file mode 100644 index 0000000..143bf3c --- /dev/null +++ b/masterror-cli/src/sections/fix.rs @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Fix section - shows fix suggestions with code examples. +#![allow(dead_code)] + +use owo_colors::OwoColorize; + +use crate::{knowledge::FixSuggestion, locale::Locale}; + +/// Print fix suggestions with code examples. +pub fn print(locale: &Locale, fixes: &[FixSuggestion], colored: bool) { + if fixes.is_empty() { + return; + } + + let label = locale.get("label-fix"); + if colored { + println!("{}", label.green().bold()); + } else { + println!("{label}"); + } + + for (i, fix) in fixes.iter().enumerate() { + let desc = locale.get(fix.description_key); + if colored { + println!(" {}. {}", (i + 1).to_string().cyan(), desc); + println!(" {}", fix.code.dimmed()); + } else { + println!(" {}. {}", i + 1, desc); + println!(" {}", fix.code); + } + } +} diff --git a/masterror-cli/src/sections/link.rs b/masterror-cli/src/sections/link.rs new file mode 100644 index 0000000..14b4ace --- /dev/null +++ b/masterror-cli/src/sections/link.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Link section - shows documentation URLs. +#![allow(dead_code)] + +use owo_colors::OwoColorize; + +use crate::{knowledge::DocLink, locale::Locale}; + +/// Print documentation links with titles. +pub fn print(locale: &Locale, links: &[DocLink], colored: bool) { + if links.is_empty() { + return; + } + + let label = locale.get("label-link"); + if colored { + println!("{}", label.blue().bold()); + } else { + println!("{label}"); + } + + for link in links { + if colored { + println!(" {} {}", link.title.cyan(), link.url.underline().dimmed()); + } else { + println!(" {} {}", link.title, link.url); + } + } +} diff --git a/masterror-cli/src/sections/translation.rs b/masterror-cli/src/sections/translation.rs new file mode 100644 index 0000000..2cdbb7d --- /dev/null +++ b/masterror-cli/src/sections/translation.rs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Translation section - shows full translated compiler error. +#![allow(dead_code)] + +use owo_colors::OwoColorize; + +use crate::locale::Locale; + +/// Print full translated copy of compiler error. +pub fn print(locale: &Locale, _error_code: &str, rendered: Option<&str>, colored: bool) { + if !locale.has_translation() { + return; + } + + let Some(rendered) = rendered else { + return; + }; + + let translated = locale.translate_rendered(rendered); + + let label = locale.get("label-translation"); + if colored { + println!("{}", label.cyan().bold()); + } else { + println!("{label}"); + } + + for line in translated.lines() { + println!(" {line}"); + } +} diff --git a/masterror-cli/src/sections/why.rs b/masterror-cli/src/sections/why.rs new file mode 100644 index 0000000..03e60f0 --- /dev/null +++ b/masterror-cli/src/sections/why.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Why section - explains the error cause in detail. +#![allow(dead_code)] + +use owo_colors::OwoColorize; + +use crate::locale::Locale; + +/// Print detailed explanation of the error. +pub fn print(locale: &Locale, explanation_key: &str, colored: bool) { + let label = locale.get("label-why"); + let explanation = locale.get(explanation_key); + + if colored { + println!("{}", label.yellow().bold()); + } else { + println!("{label}"); + } + + for line in explanation.lines() { + println!(" {line}"); + } +} + +/// Print explanation with indent (for explain command). +pub fn print_indented(locale: &Locale, explanation_key: &str, colored: bool) { + print(locale, explanation_key, colored); +} From 86cc5eb82a1a90bd6d7e7a2efdd507c7bdcd76b1 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 12:32:13 +0700 Subject: [PATCH 05/16] feat(cli): add cargo subcommand and AUR package - Add cargo-masterror binary for `cargo masterror` usage - Add PKGBUILD and .SRCINFO for AUR distribution --- examples/cli-test-errors/Cargo.lock | 15 ++++++++++ masterror-cli/Cargo.toml | 4 +++ pkg/aur/.SRCINFO | 14 +++++++++ pkg/aur/PKGBUILD | 44 +++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 examples/cli-test-errors/Cargo.lock create mode 100644 pkg/aur/.SRCINFO create mode 100644 pkg/aur/PKGBUILD diff --git a/examples/cli-test-errors/Cargo.lock b/examples/cli-test-errors/Cargo.lock new file mode 100644 index 0000000..f872b2e --- /dev/null +++ b/examples/cli-test-errors/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "cli-test-errors" +version = "0.1.0" + +[[patch.unused]] +name = "masterror-derive" +version = "0.11.2" + +[[patch.unused]] +name = "masterror-template" +version = "0.4.1" diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml index a43e207..072d50b 100644 --- a/masterror-cli/Cargo.toml +++ b/masterror-cli/Cargo.toml @@ -18,6 +18,10 @@ categories = ["command-line-utilities", "development-tools"] name = "masterror" path = "src/main.rs" +[[bin]] +name = "cargo-masterror" +path = "src/main.rs" + [dependencies] # CLI framework clap = { version = "4", features = ["derive", "env", "wrap_help"] } diff --git a/pkg/aur/.SRCINFO b/pkg/aur/.SRCINFO new file mode 100644 index 0000000..fe1f3cd --- /dev/null +++ b/pkg/aur/.SRCINFO @@ -0,0 +1,14 @@ +pkgbase = masterror + pkgdesc = CLI tool for explaining Rust compiler errors in human-friendly language + pkgver = 0.1.0 + pkgrel = 1 + url = https://github.com/RAprogramm/masterror + arch = x86_64 + arch = aarch64 + license = MIT + makedepends = cargo + depends = gcc-libs + source = masterror-0.1.0.tar.gz::https://github.com/RAprogramm/masterror/archive/v0.1.0.tar.gz + sha256sums = SKIP + +pkgname = masterror diff --git a/pkg/aur/PKGBUILD b/pkg/aur/PKGBUILD new file mode 100644 index 0000000..0fbc002 --- /dev/null +++ b/pkg/aur/PKGBUILD @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +# Maintainer: RAprogramm +pkgname=masterror +pkgver=0.1.0 +pkgrel=1 +pkgdesc="CLI tool for explaining Rust compiler errors in human-friendly language" +arch=('x86_64' 'aarch64') +url="https://github.com/RAprogramm/masterror" +license=('MIT') +depends=('gcc-libs') +makedepends=('cargo') +source=("$pkgname-$pkgver.tar.gz::$url/archive/v$pkgver.tar.gz") +sha256sums=('SKIP') + +prepare() { + cd "$pkgname-$pkgver" + export RUSTUP_TOOLCHAIN=stable + cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')" +} + +build() { + cd "$pkgname-$pkgver/masterror-cli" + export RUSTUP_TOOLCHAIN=stable + export CARGO_TARGET_DIR=target + cargo build --frozen --release --all-features +} + +check() { + cd "$pkgname-$pkgver/masterror-cli" + export RUSTUP_TOOLCHAIN=stable + export CARGO_TARGET_DIR=target + cargo test --frozen --release +} + +package() { + cd "$pkgname-$pkgver" + install -Dm755 "masterror-cli/target/release/masterror" "$pkgdir/usr/bin/masterror" + install -Dm755 "masterror-cli/target/release/cargo-masterror" "$pkgdir/usr/bin/cargo-masterror" + install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" + install -Dm644 masterror-cli/README.md "$pkgdir/usr/share/doc/$pkgname/README.md" +} From 032bde6fe2254fed26a0a3e4b29c77cd4894b475 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 12:43:18 +0700 Subject: [PATCH 06/16] check --- .hooks/pre-commit | 2 ++ REUSE.toml | 10 ++++++++++ src/app_error/core/builder.rs | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 REUSE.toml diff --git a/.hooks/pre-commit b/.hooks/pre-commit index d20bd92..ccc498a 100755 --- a/.hooks/pre-commit +++ b/.hooks/pre-commit @@ -33,9 +33,11 @@ fi echo "🔒 Checking no_std compatibility..." cargo check --no-default-features -q +cargo check --features std -q cargo check --no-default-features --features tracing -q cargo check --no-default-features --features metrics -q cargo check --no-default-features --features colored -q +cargo check --all-features -q echo "🔍 Running clippy (all features, all targets)..." cargo clippy --workspace --all-targets --all-features -- -D warnings diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 0000000..8afcfc4 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +version = 1 + +[[annotations]] +path = ["**/Cargo.lock", "pkg/aur/.SRCINFO", "masterror-cli/src/locale/ko.rs"] +SPDX-FileCopyrightText = "2025-2026 RAprogramm " +SPDX-License-Identifier = "MIT" diff --git a/src/app_error/core/builder.rs b/src/app_error/core/builder.rs index c803749..c909acc 100644 --- a/src/app_error/core/builder.rs +++ b/src/app_error/core/builder.rs @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -use alloc::{borrow::Cow, string::String, sync::Arc}; +use alloc::{borrow::Cow, boxed::Box, string::String, sync::Arc}; use core::error::Error as CoreError; #[cfg(feature = "backtrace")] use std::backtrace::Backtrace; From 2d7b470ab5b3bf35c57e09a3311f190ab2246a55 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 13:36:38 +0700 Subject: [PATCH 07/16] feat(cli): add 31 error explanations and 15 RustManifest best practices - Add errors module with 6 categories: Ownership, Borrowing, Lifetimes, Types, Traits, Resolution - Add raprogramm module with 15 best practices (RA001-RA015) from RustManifest - Add practice command to list and show best practices - Extend explain command to handle both E* and RA* codes - Remove legacy knowledge.rs, use LocalizedText for i18n - Unify output formatting for errors and practices - Expand cli-test-errors example with more error cases --- REUSE.toml | 10 +- examples/cli-test-errors/.cargo/config.toml | 7 + examples/cli-test-errors/src/main.rs | 126 ++++++++++- masterror-cli/src/commands.rs | 1 + masterror-cli/src/commands/check.rs | 2 +- masterror-cli/src/commands/explain.rs | 188 +++++++++++++--- masterror-cli/src/commands/list.rs | 61 ++++-- masterror-cli/src/commands/practice.rs | 213 +++++++++++++++++++ masterror-cli/src/errors.rs | 183 ++++++++++++++++ masterror-cli/src/errors/borrowing.rs | 31 +++ masterror-cli/src/errors/borrowing/e0499.rs | 68 ++++++ masterror-cli/src/errors/borrowing/e0500.rs | 50 +++++ masterror-cli/src/errors/borrowing/e0501.rs | 41 ++++ masterror-cli/src/errors/borrowing/e0502.rs | 63 ++++++ masterror-cli/src/errors/borrowing/e0503.rs | 42 ++++ masterror-cli/src/errors/borrowing/e0506.rs | 40 ++++ masterror-cli/src/errors/borrowing/e0508.rs | 50 +++++ masterror-cli/src/errors/borrowing/e0596.rs | 51 +++++ masterror-cli/src/errors/lifetimes.rs | 31 +++ masterror-cli/src/errors/lifetimes/e0106.rs | 68 ++++++ masterror-cli/src/errors/lifetimes/e0495.rs | 38 ++++ masterror-cli/src/errors/lifetimes/e0515.rs | 51 +++++ masterror-cli/src/errors/lifetimes/e0597.rs | 57 +++++ masterror-cli/src/errors/lifetimes/e0621.rs | 38 ++++ masterror-cli/src/errors/lifetimes/e0623.rs | 37 ++++ masterror-cli/src/errors/lifetimes/e0700.rs | 39 ++++ masterror-cli/src/errors/lifetimes/e0716.rs | 40 ++++ masterror-cli/src/errors/ownership.rs | 29 +++ masterror-cli/src/errors/ownership/e0381.rs | 55 +++++ masterror-cli/src/errors/ownership/e0382.rs | 80 +++++++ masterror-cli/src/errors/ownership/e0383.rs | 46 ++++ masterror-cli/src/errors/ownership/e0384.rs | 62 ++++++ masterror-cli/src/errors/ownership/e0505.rs | 56 +++++ masterror-cli/src/errors/ownership/e0507.rs | 71 +++++++ masterror-cli/src/errors/ownership/e0509.rs | 52 +++++ masterror-cli/src/errors/raprogramm.rs | 150 +++++++++++++ masterror-cli/src/errors/raprogramm/ra001.rs | 39 ++++ masterror-cli/src/errors/raprogramm/ra002.rs | 34 +++ masterror-cli/src/errors/raprogramm/ra003.rs | 39 ++++ masterror-cli/src/errors/raprogramm/ra004.rs | 40 ++++ masterror-cli/src/errors/raprogramm/ra005.rs | 48 +++++ masterror-cli/src/errors/raprogramm/ra006.rs | 46 ++++ masterror-cli/src/errors/raprogramm/ra007.rs | 44 ++++ masterror-cli/src/errors/raprogramm/ra008.rs | 50 +++++ masterror-cli/src/errors/raprogramm/ra009.rs | 58 +++++ masterror-cli/src/errors/raprogramm/ra010.rs | 56 +++++ masterror-cli/src/errors/raprogramm/ra011.rs | 44 ++++ masterror-cli/src/errors/raprogramm/ra012.rs | 49 +++++ masterror-cli/src/errors/raprogramm/ra013.rs | 61 ++++++ masterror-cli/src/errors/raprogramm/ra014.rs | 38 ++++ masterror-cli/src/errors/raprogramm/ra015.rs | 43 ++++ masterror-cli/src/errors/resolution.rs | 17 ++ masterror-cli/src/errors/resolution/e0412.rs | 28 +++ masterror-cli/src/errors/resolution/e0425.rs | 32 +++ masterror-cli/src/errors/resolution/e0433.rs | 38 ++++ masterror-cli/src/errors/traits.rs | 16 ++ masterror-cli/src/errors/traits/e0038.rs | 28 +++ masterror-cli/src/errors/traits/e0282.rs | 32 +++ masterror-cli/src/errors/types.rs | 17 ++ masterror-cli/src/errors/types/e0277.rs | 42 ++++ masterror-cli/src/errors/types/e0308.rs | 30 +++ masterror-cli/src/errors/types/e0599.rs | 32 +++ masterror-cli/src/knowledge.rs | 208 ------------------ masterror-cli/src/locale.rs | 5 + masterror-cli/src/main.rs | 26 ++- masterror-cli/src/output.rs | 33 ++- masterror-cli/src/sections/fix.rs | 13 +- masterror-cli/src/sections/link.rs | 11 +- masterror-cli/src/sections/translation.rs | 18 +- masterror-cli/src/sections/why.rs | 16 +- 70 files changed, 3262 insertions(+), 296 deletions(-) create mode 100644 examples/cli-test-errors/.cargo/config.toml create mode 100644 masterror-cli/src/commands/practice.rs create mode 100644 masterror-cli/src/errors.rs create mode 100644 masterror-cli/src/errors/borrowing.rs create mode 100644 masterror-cli/src/errors/borrowing/e0499.rs create mode 100644 masterror-cli/src/errors/borrowing/e0500.rs create mode 100644 masterror-cli/src/errors/borrowing/e0501.rs create mode 100644 masterror-cli/src/errors/borrowing/e0502.rs create mode 100644 masterror-cli/src/errors/borrowing/e0503.rs create mode 100644 masterror-cli/src/errors/borrowing/e0506.rs create mode 100644 masterror-cli/src/errors/borrowing/e0508.rs create mode 100644 masterror-cli/src/errors/borrowing/e0596.rs create mode 100644 masterror-cli/src/errors/lifetimes.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0106.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0495.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0515.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0597.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0621.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0623.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0700.rs create mode 100644 masterror-cli/src/errors/lifetimes/e0716.rs create mode 100644 masterror-cli/src/errors/ownership.rs create mode 100644 masterror-cli/src/errors/ownership/e0381.rs create mode 100644 masterror-cli/src/errors/ownership/e0382.rs create mode 100644 masterror-cli/src/errors/ownership/e0383.rs create mode 100644 masterror-cli/src/errors/ownership/e0384.rs create mode 100644 masterror-cli/src/errors/ownership/e0505.rs create mode 100644 masterror-cli/src/errors/ownership/e0507.rs create mode 100644 masterror-cli/src/errors/ownership/e0509.rs create mode 100644 masterror-cli/src/errors/raprogramm.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra001.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra002.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra003.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra004.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra005.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra006.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra007.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra008.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra009.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra010.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra011.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra012.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra013.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra014.rs create mode 100644 masterror-cli/src/errors/raprogramm/ra015.rs create mode 100644 masterror-cli/src/errors/resolution.rs create mode 100644 masterror-cli/src/errors/resolution/e0412.rs create mode 100644 masterror-cli/src/errors/resolution/e0425.rs create mode 100644 masterror-cli/src/errors/resolution/e0433.rs create mode 100644 masterror-cli/src/errors/traits.rs create mode 100644 masterror-cli/src/errors/traits/e0038.rs create mode 100644 masterror-cli/src/errors/traits/e0282.rs create mode 100644 masterror-cli/src/errors/types.rs create mode 100644 masterror-cli/src/errors/types/e0277.rs create mode 100644 masterror-cli/src/errors/types/e0308.rs create mode 100644 masterror-cli/src/errors/types/e0599.rs delete mode 100644 masterror-cli/src/knowledge.rs diff --git a/REUSE.toml b/REUSE.toml index 8afcfc4..cbc61cc 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -5,6 +5,14 @@ version = 1 [[annotations]] -path = ["**/Cargo.lock", "pkg/aur/.SRCINFO", "masterror-cli/src/locale/ko.rs"] +path = [ + "**/Cargo.lock", + "pkg/aur/.SRCINFO", + "**/.cargo/config.toml", + # Files with UTF-8 non-ASCII content that reuse fails to parse + "masterror-cli/src/locale/ko.rs", + "masterror-cli/src/errors/ownership/e0382.rs", + "masterror-cli/src/errors/ownership/e0384.rs" +] SPDX-FileCopyrightText = "2025-2026 RAprogramm " SPDX-License-Identifier = "MIT" diff --git a/examples/cli-test-errors/.cargo/config.toml b/examples/cli-test-errors/.cargo/config.toml new file mode 100644 index 0000000..c1723c4 --- /dev/null +++ b/examples/cli-test-errors/.cargo/config.toml @@ -0,0 +1,7 @@ +# This crate contains intentional compile errors. +# Do not build it normally - use `masterror check` instead. + +[alias] +# Disable normal cargo commands - this crate should only be used with masterror +check = "echo 'Use: masterror check (this crate has intentional errors)'" +build = "echo 'Use: masterror check (this crate has intentional errors)'" diff --git a/examples/cli-test-errors/src/main.rs b/examples/cli-test-errors/src/main.rs index db7693e..f86be25 100644 --- a/examples/cli-test-errors/src/main.rs +++ b/examples/cli-test-errors/src/main.rs @@ -7,17 +7,61 @@ //! This file contains INTENTIONAL compile errors to test masterror-cli. //! It should NOT be compiled directly - only used with `masterror check`. //! -//! Run: `cd examples/cli-test-errors && cargo run -p masterror-cli -- check` - -// This file is excluded from normal compilation. -// See Cargo.toml `[[bin]]` section. +//! Run: `cd examples/cli-test-errors && cargo masterror check` +//! +//! To see all masterror features: +//! ```sh +//! # List all known errors +//! masterror list +//! +//! # List by category +//! masterror list -c ownership +//! +//! # Explain specific error +//! masterror explain E0382 +//! +//! # List best practices +//! masterror practice +//! +//! # Explain best practice +//! masterror explain RA001 +//! +//! # Use Russian language +//! masterror -l ru list +//! masterror -l ru explain E0382 +//! +//! # Use Korean language +//! masterror -l ko list +//! ``` fn main() { - // E0382 - Use of moved value + // ==================== OWNERSHIP ERRORS ==================== + + // E0382 - Borrow of moved value let s = String::from("hello"); let s2 = s; println!("{}", s); // error: value moved + // E0381 - Borrow of possibly-uninitialized variable + let x: i32; + println!("{}", x); // error: possibly uninitialized + + // E0384 - Cannot assign twice to immutable variable + let y = 5; + y = 10; // error: immutable variable + + // E0505 - Cannot move out because it is borrowed + let mut data = String::from("data"); + let r = &data; + let moved = data; // error: borrowed + println!("{}", r); + + // E0507 - Cannot move out of borrowed content + let borrowed = &String::from("borrowed"); + let owned = *borrowed; // error: cannot move out of borrowed + + // ==================== BORROWING ERRORS ==================== + // E0502 - Cannot borrow as mutable (already borrowed as immutable) let mut v = vec![1, 2, 3]; let first = &v[0]; @@ -25,8 +69,74 @@ fn main() { println!("{}", first); // E0499 - Cannot borrow as mutable more than once - let mut x = 5; - let r1 = &mut x; - let r2 = &mut x; // error: second mutable borrow + let mut num = 5; + let r1 = &mut num; + let r2 = &mut num; // error: second mutable borrow println!("{} {}", r1, r2); + + // E0596 - Cannot borrow as mutable (not declared as mutable) + let vec = vec![1, 2, 3]; + vec.push(4); // error: not mutable + + // E0503 - Cannot use value because it was mutably borrowed + let mut borrowed_mut = 10; + let r = &mut borrowed_mut; + let copy = borrowed_mut; // error: mutably borrowed + *r = 20; + + // ==================== LIFETIME ERRORS ==================== + + // E0106 - Missing lifetime specifier + struct MissingLifetime { + data: &str, // error: missing lifetime + } + + // E0597 - Value does not live long enough + let reference; + { + let short_lived = String::from("short"); + reference = &short_lived; // error: does not live long enough + } + println!("{}", reference); + + // E0515 - Cannot return reference to temporary value + fn returns_ref() -> &str { + &String::from("temp") // error: returns reference to temporary + } + + // ==================== TYPE ERRORS ==================== + + // E0308 - Mismatched types + let number: i32 = "not a number"; // error: expected i32, found &str + + // E0277 - Trait bound not satisfied + fn requires_display(t: T) {} + struct NoDisplay; + requires_display(NoDisplay); // error: Display not implemented + + // E0599 - Method not found + let val = 42; + val.nonexistent_method(); // error: method not found + + // ==================== TRAIT ERRORS ==================== + + // E0038 - Cannot be made into an object + trait NotObjectSafe { + fn generic(&self); + } + fn takes_dyn(obj: &dyn NotObjectSafe) {} // error: not object safe + + // E0282 - Type annotations needed + let needs_type = Default::default(); // error: cannot infer type + + // ==================== RESOLUTION ERRORS ==================== + + // E0412 - Cannot find type in this scope + let value: NonExistentType = todo!(); // error: type not found + + // E0425 - Cannot find value in this scope + let result = undefined_variable + 1; // error: value not found + + // E0433 - Failed to resolve: use of undeclared crate or module + use nonexistent::module; // error: module not found } diff --git a/masterror-cli/src/commands.rs b/masterror-cli/src/commands.rs index 29a925c..225cafd 100644 --- a/masterror-cli/src/commands.rs +++ b/masterror-cli/src/commands.rs @@ -7,6 +7,7 @@ mod check; mod explain; mod list; +pub mod practice; pub use check::run as check; pub use explain::run as explain; diff --git a/masterror-cli/src/commands/check.rs b/masterror-cli/src/commands/check.rs index 5907db1..6449643 100644 --- a/masterror-cli/src/commands/check.rs +++ b/masterror-cli/src/commands/check.rs @@ -42,7 +42,7 @@ pub fn run( && msg.is_error() { error_count += 1; - output::print_error(locale, &msg, opts); + output::print_error(locale.lang(), &msg, opts); println!(); } } diff --git a/masterror-cli/src/commands/explain.rs b/masterror-cli/src/commands/explain.rs index 788092f..ad314ff 100644 --- a/masterror-cli/src/commands/explain.rs +++ b/masterror-cli/src/commands/explain.rs @@ -2,39 +2,52 @@ // // SPDX-License-Identifier: MIT -//! Explain command - explain a specific error code. +//! Explain command - explain a specific error code or best practice. use owo_colors::OwoColorize; -#[allow(unused_imports)] -use crate::sections; use crate::{ - knowledge::{self, ErrorEntry}, - locale::Locale, + errors::{ + ErrorEntry, ErrorRegistry, + raprogramm::{BestPractice, PracticeRegistry} + }, options::DisplayOptions }; -/// Explain a specific error code. +/// Explain a specific error code (E0382) or best practice (RA001). pub fn run( - locale: &Locale, + lang: &str, code: &str, opts: &DisplayOptions ) -> Result<(), Box> { - let Some(entry) = knowledge::find(code) else { - eprintln!("Unknown error code: {code}"); - eprintln!("Run `masterror list` to see available codes."); - std::process::exit(1); - }; + let upper = code.to_uppercase(); + + // Check if it's a best practice code (RA*) + if upper.starts_with("RA") { + let registry = PracticeRegistry::new(); + if let Some(practice) = registry.find(&upper) { + print_practice(lang, practice, opts); + return Ok(()); + } + } + + // Check if it's an error code (E*) + let registry = ErrorRegistry::new(); + if let Some(entry) = registry.find(code) { + print_error(lang, entry, opts); + return Ok(()); + } - print_explain(locale, entry, opts); - Ok(()) + eprintln!("Unknown code: {code}"); + eprintln!("Run `masterror list` for error codes or `masterror practice` for best practices."); + std::process::exit(1); } -fn print_explain(locale: &Locale, entry: &ErrorEntry, opts: &DisplayOptions) { +fn print_error(lang: &str, entry: &ErrorEntry, opts: &DisplayOptions) { println!(); // Title - let title = locale.get(entry.title_key); + let title = entry.title.get(lang); if opts.colored { println!("{} - {}", entry.code.yellow().bold(), title.bold()); } else { @@ -42,30 +55,153 @@ fn print_explain(locale: &Locale, entry: &ErrorEntry, opts: &DisplayOptions) { } // Category - let cat_key = format!("category-{}", entry.category); - let category = locale.get(&cat_key); + let category = entry.category.name(lang); if opts.colored { println!("Category: {}", category.dimmed()); } else { println!("Category: {category}"); } - #[cfg(feature = "show-why")] - { - println!(); - sections::why::print(locale, entry.explanation_key, opts.colored); + // Explanation + println!(); + if opts.colored { + println!("{}", "Why this happens:".green().bold()); + } else { + println!("Why this happens:"); } + println!("{}", entry.explanation.get(lang)); - #[cfg(feature = "show-fix")] + // Fixes if !entry.fixes.is_empty() { println!(); - sections::fix::print(locale, entry.fixes, opts.colored); + if opts.colored { + println!("{}", "How to fix:".green().bold()); + } else { + println!("How to fix:"); + } + for (i, fix) in entry.fixes.iter().enumerate() { + println!(); + println!("{}. {}", i + 1, fix.description.get(lang)); + println!("```rust"); + println!("{}", fix.code); + println!("```"); + } } - #[cfg(feature = "show-link")] + // Links if !entry.links.is_empty() { println!(); - sections::link::print(locale, entry.links, opts.colored); + if opts.colored { + println!("{}", "Learn more:".cyan().bold()); + } else { + println!("Learn more:"); + } + for link in entry.links { + if opts.colored { + println!(" - {} {}", link.title, link.url.dimmed()); + } else { + println!(" - {} {}", link.title, link.url); + } + } + } + + println!(); +} + +fn print_practice(lang: &str, practice: &BestPractice, opts: &DisplayOptions) { + println!(); + + // Title + let title = practice.title.get(lang); + if opts.colored { + println!("{} - {}", practice.code.yellow().bold(), title.bold()); + } else { + println!("{} - {title}", practice.code); + } + + // Category + let category = practice.category.name(lang); + if opts.colored { + println!("Category: {}", category.dimmed()); + } else { + println!("Category: {category}"); + } + + // Explanation + println!(); + let why_label = match lang { + "ru" => "Почему это важно:", + "ko" => "왜 중요한가:", + _ => "Why this matters:" + }; + if opts.colored { + println!("{}", why_label.green().bold()); + } else { + println!("{why_label}"); + } + println!("{}", practice.explanation.get(lang)); + + // How to apply + println!(); + let how_label = match lang { + "ru" => "Как применять:", + "ko" => "적용 방법:", + _ => "How to apply:" + }; + if opts.colored { + println!("{}", how_label.green().bold()); + } else { + println!("{how_label}"); + } + + // Bad example + println!(); + let avoid_label = match lang { + "ru" => "Избегайте", + "ko" => "피하세요", + _ => "Avoid" + }; + if opts.colored { + println!("{}. {}", "1".cyan(), avoid_label.red()); + } else { + println!("1. {avoid_label}"); + } + println!("```rust"); + println!("{}", practice.bad_example); + println!("```"); + + // Good example + println!(); + let prefer_label = match lang { + "ru" => "Предпочитайте", + "ko" => "선호하세요", + _ => "Prefer" + }; + if opts.colored { + println!("{}. {}", "2".cyan(), prefer_label.green()); + } else { + println!("2. {prefer_label}"); + } + println!("```rust"); + println!("{}", practice.good_example); + println!("```"); + + // Source + println!(); + let learn_label = match lang { + "ru" => "Подробнее:", + "ko" => "더 알아보기:", + _ => "Learn more:" + }; + if opts.colored { + println!("{}", learn_label.cyan().bold()); + } else { + println!("{learn_label}"); + } + if opts.colored { + println!(" - RustManifest {}", practice.source.dimmed()); + } else { + println!(" - RustManifest {}", practice.source); } println!(); diff --git a/masterror-cli/src/commands/list.rs b/masterror-cli/src/commands/list.rs index 9763245..a760cec 100644 --- a/masterror-cli/src/commands/list.rs +++ b/masterror-cli/src/commands/list.rs @@ -6,14 +6,19 @@ use owo_colors::OwoColorize; -use crate::{knowledge, locale::Locale, options::DisplayOptions}; +use crate::{ + errors::{Category, ErrorRegistry}, + options::DisplayOptions +}; /// List all known error codes. pub fn run( - locale: &Locale, + lang: &str, category: Option<&str>, opts: &DisplayOptions ) -> Result<(), Box> { + let registry = ErrorRegistry::new(); + println!(); if opts.colored { println!("{}", "Known Rust Compiler Errors".bold()); @@ -22,28 +27,33 @@ pub fn run( } println!(); - let entries = knowledge::entries(); - let filtered: Vec<_> = if let Some(cat) = category { - entries - .iter() - .filter(|e| e.category.eq_ignore_ascii_case(cat)) - .collect() + let mut entries: Vec<_> = if let Some(cat) = category { + let cat = parse_category(cat); + if let Some(c) = cat { + registry.by_category(c) + } else { + eprintln!("Unknown category: {}", category.unwrap_or("")); + eprintln!("Available: ownership, borrowing, lifetimes, types, traits, resolution"); + return Ok(()); + } } else { - entries.iter().collect() + registry.all().collect() }; - if filtered.is_empty() { + if entries.is_empty() { println!(" No errors found."); return Ok(()); } - let mut current_cat = ""; - for entry in &filtered { - if entry.category != current_cat { - current_cat = entry.category; + // Sort by code + entries.sort_by_key(|e| e.code); + + let mut current_cat: Option = None; + for entry in &entries { + if current_cat != Some(entry.category) { + current_cat = Some(entry.category); println!(); - let cat_key = format!("category-{current_cat}"); - let cat_name = locale.get(&cat_key); + let cat_name = entry.category.name(lang); if opts.colored { println!(" {}", cat_name.yellow().bold()); } else { @@ -52,7 +62,7 @@ pub fn run( println!(); } - let title = locale.get(entry.title_key); + let title = entry.title.get(lang); if opts.colored { println!(" {} - {title}", entry.code.cyan()); } else { @@ -61,8 +71,23 @@ pub fn run( } println!(); - println!("Total: {} errors", filtered.len()); + println!("Total: {} errors", entries.len()); + println!(); + println!("Use `masterror explain ` to see details."); + println!("Use `masterror practice` to see best practices."); println!(); Ok(()) } + +fn parse_category(s: &str) -> Option { + match s.to_lowercase().as_str() { + "ownership" | "own" => Some(Category::Ownership), + "borrowing" | "borrow" => Some(Category::Borrowing), + "lifetimes" | "lifetime" | "life" => Some(Category::Lifetimes), + "types" | "type" => Some(Category::Types), + "traits" | "trait" => Some(Category::Traits), + "resolution" | "resolve" | "names" => Some(Category::Resolution), + _ => None + } +} diff --git a/masterror-cli/src/commands/practice.rs b/masterror-cli/src/commands/practice.rs new file mode 100644 index 0000000..b296d10 --- /dev/null +++ b/masterror-cli/src/commands/practice.rs @@ -0,0 +1,213 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Practice command - show best practices from RustManifest. + +use owo_colors::OwoColorize; + +use crate::{ + errors::raprogramm::{BestPractice, PracticeCategory, PracticeRegistry}, + options::DisplayOptions +}; + +/// List all best practices or filter by category. +pub fn list( + lang: &str, + category: Option<&str>, + opts: &DisplayOptions +) -> Result<(), Box> { + let registry = PracticeRegistry::new(); + + println!(); + if opts.colored { + println!("{}", "RustManifest Best Practices".bold()); + } else { + println!("RustManifest Best Practices"); + } + println!(); + + let practices: Vec<_> = if let Some(cat) = category { + let cat = parse_category(cat); + if let Some(c) = cat { + registry.by_category(c) + } else { + eprintln!("Unknown category: {}", category.unwrap_or("")); + eprintln!( + "Available: error-handling, performance, naming, documentation, design, testing, security" + ); + return Ok(()); + } + } else { + registry.all().collect() + }; + + if practices.is_empty() { + println!(" No practices found."); + return Ok(()); + } + + let mut sorted = practices; + sorted.sort_by_key(|p| p.code); + + let mut current_cat: Option = None; + for practice in &sorted { + if current_cat != Some(practice.category) { + current_cat = Some(practice.category); + println!(); + if opts.colored { + println!(" {}", practice.category.name(lang).yellow().bold()); + } else { + println!(" {}", practice.category.name(lang)); + } + println!(); + } + + let title = practice.title.get(lang); + if opts.colored { + println!(" {} - {title}", practice.code.cyan()); + } else { + println!(" {} - {title}", practice.code); + } + } + + println!(); + println!("Total: {} practices", sorted.len()); + println!(); + println!("Use `masterror practice ` to see details."); + println!(); + + Ok(()) +} + +/// Show a specific best practice. +pub fn show( + lang: &str, + code: &str, + opts: &DisplayOptions +) -> Result<(), Box> { + let registry = PracticeRegistry::new(); + + let Some(practice) = registry.find(code) else { + eprintln!("Unknown practice code: {code}"); + eprintln!("Run `masterror practice` to see available codes."); + std::process::exit(1); + }; + + print_practice(lang, practice, opts); + Ok(()) +} + +fn print_practice(lang: &str, practice: &BestPractice, opts: &DisplayOptions) { + println!(); + + // Title + let title = practice.title.get(lang); + if opts.colored { + println!("{} - {}", practice.code.yellow().bold(), title.bold()); + } else { + println!("{} - {title}", practice.code); + } + + // Category + let category = practice.category.name(lang); + if opts.colored { + println!("Category: {}", category.dimmed()); + } else { + println!("Category: {category}"); + } + + // Explanation + println!(); + let why_label = match lang { + "ru" => "Почему это важно:", + "ko" => "왜 중요한가:", + _ => "Why this matters:" + }; + if opts.colored { + println!("{}", why_label.green().bold()); + } else { + println!("{why_label}"); + } + println!("{}", practice.explanation.get(lang)); + + // How to apply + println!(); + let how_label = match lang { + "ru" => "Как применять:", + "ko" => "적용 방법:", + _ => "How to apply:" + }; + if opts.colored { + println!("{}", how_label.green().bold()); + } else { + println!("{how_label}"); + } + + // Bad example + println!(); + let avoid_label = match lang { + "ru" => "Избегайте", + "ko" => "피하세요", + _ => "Avoid" + }; + if opts.colored { + println!("{}. {}", "1".cyan(), avoid_label.red()); + } else { + println!("1. {avoid_label}"); + } + println!("```rust"); + println!("{}", practice.bad_example); + println!("```"); + + // Good example + println!(); + let prefer_label = match lang { + "ru" => "Предпочитайте", + "ko" => "선호하세요", + _ => "Prefer" + }; + if opts.colored { + println!("{}. {}", "2".cyan(), prefer_label.green()); + } else { + println!("2. {prefer_label}"); + } + println!("```rust"); + println!("{}", practice.good_example); + println!("```"); + + // Source + println!(); + let learn_label = match lang { + "ru" => "Подробнее:", + "ko" => "더 알아보기:", + _ => "Learn more:" + }; + if opts.colored { + println!("{}", learn_label.cyan().bold()); + } else { + println!("{learn_label}"); + } + if opts.colored { + println!(" - RustManifest {}", practice.source.dimmed()); + } else { + println!(" - RustManifest {}", practice.source); + } + + println!(); +} + +fn parse_category(s: &str) -> Option { + match s.to_lowercase().as_str() { + "error-handling" | "error_handling" | "errorhandling" | "errors" => { + Some(PracticeCategory::ErrorHandling) + } + "performance" | "perf" => Some(PracticeCategory::Performance), + "naming" | "names" => Some(PracticeCategory::Naming), + "documentation" | "docs" | "doc" => Some(PracticeCategory::Documentation), + "design" | "architecture" | "arch" => Some(PracticeCategory::Design), + "testing" | "tests" | "test" => Some(PracticeCategory::Testing), + "security" | "sec" => Some(PracticeCategory::Security), + _ => None + } +} diff --git a/masterror-cli/src/errors.rs b/masterror-cli/src/errors.rs new file mode 100644 index 0000000..406a20b --- /dev/null +++ b/masterror-cli/src/errors.rs @@ -0,0 +1,183 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Rust compiler error explanations organized by category. + +pub mod borrowing; +pub mod lifetimes; +pub mod ownership; +pub mod raprogramm; +pub mod resolution; +pub mod traits; +pub mod types; + +use std::collections::HashMap; + +/// Link with title for documentation. +#[derive(Debug, Clone)] +pub struct DocLink { + pub title: &'static str, + pub url: &'static str +} + +/// Fix suggestion with code example. +#[derive(Debug, Clone)] +pub struct FixSuggestion { + pub description: LocalizedText, + pub code: &'static str +} + +/// Localized text with translations. +#[derive(Debug, Clone)] +pub struct LocalizedText { + pub en: &'static str, + pub ru: &'static str, + pub ko: &'static str +} + +impl LocalizedText { + pub const fn new(en: &'static str, ru: &'static str, ko: &'static str) -> Self { + Self { + en, + ru, + ko + } + } + + pub fn get(&self, lang: &str) -> &'static str { + match lang { + "ru" => self.ru, + "ko" => self.ko, + _ => self.en + } + } +} + +/// Error category. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Category { + Ownership, + Borrowing, + Lifetimes, + Types, + Traits, + Resolution +} + +impl Category { + pub fn name(&self, lang: &str) -> &'static str { + match (self, lang) { + (Self::Ownership, "ru") => "Владение", + (Self::Ownership, "ko") => "소유권", + (Self::Ownership, _) => "Ownership", + + (Self::Borrowing, "ru") => "Заимствование", + (Self::Borrowing, "ko") => "빌림", + (Self::Borrowing, _) => "Borrowing", + + (Self::Lifetimes, "ru") => "Времена жизни", + (Self::Lifetimes, "ko") => "라이프타임", + (Self::Lifetimes, _) => "Lifetimes", + + (Self::Types, "ru") => "Типы", + (Self::Types, "ko") => "타입", + (Self::Types, _) => "Types", + + (Self::Traits, "ru") => "Трейты", + (Self::Traits, "ko") => "트레이트", + (Self::Traits, _) => "Traits", + + (Self::Resolution, "ru") => "Разрешение имён", + (Self::Resolution, "ko") => "이름 확인", + (Self::Resolution, _) => "Name Resolution" + } + } +} + +/// Complete error entry. +#[derive(Debug, Clone)] +pub struct ErrorEntry { + pub code: &'static str, + pub title: LocalizedText, + pub category: Category, + pub explanation: LocalizedText, + pub fixes: &'static [FixSuggestion], + pub links: &'static [DocLink] +} + +/// Registry of all known errors. +pub struct ErrorRegistry { + errors: HashMap<&'static str, &'static ErrorEntry> +} + +impl ErrorRegistry { + /// Build registry from all modules. + pub fn new() -> Self { + let mut errors = HashMap::new(); + + // Ownership errors + for entry in ownership::entries() { + errors.insert(entry.code, *entry); + } + + // Borrowing errors + for entry in borrowing::entries() { + errors.insert(entry.code, *entry); + } + + // Lifetime errors + for entry in lifetimes::entries() { + errors.insert(entry.code, *entry); + } + + // Type errors + for entry in types::entries() { + errors.insert(entry.code, *entry); + } + + // Trait errors + for entry in traits::entries() { + errors.insert(entry.code, *entry); + } + + // Resolution errors + for entry in resolution::entries() { + errors.insert(entry.code, *entry); + } + + Self { + errors + } + } + + /// Find error by code. + pub fn find(&self, code: &str) -> Option<&'static ErrorEntry> { + let normalized = if code.starts_with('E') || code.starts_with('e') { + code.to_uppercase() + } else { + format!("E{code}") + }; + self.errors.get(normalized.as_str()).copied() + } + + /// Get all errors. + pub fn all(&self) -> impl Iterator + '_ { + self.errors.values().copied() + } + + /// Get errors by category. + pub fn by_category(&self, cat: Category) -> Vec<&'static ErrorEntry> { + self.errors + .values() + .filter(|e| e.category == cat) + .copied() + .collect() + } +} + +impl Default for ErrorRegistry { + fn default() -> Self { + Self::new() + } +} diff --git a/masterror-cli/src/errors/borrowing.rs b/masterror-cli/src/errors/borrowing.rs new file mode 100644 index 0000000..d857c8b --- /dev/null +++ b/masterror-cli/src/errors/borrowing.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Borrowing-related errors. + +mod e0499; +mod e0500; +mod e0501; +mod e0502; +mod e0503; +mod e0506; +mod e0508; +mod e0596; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0499::ENTRY, + &e0500::ENTRY, + &e0501::ENTRY, + &e0502::ENTRY, + &e0503::ENTRY, + &e0506::ENTRY, + &e0508::ENTRY, + &e0596::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/borrowing/e0499.rs b/masterror-cli/src/errors/borrowing/e0499.rs new file mode 100644 index 0000000..b43ca0b --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0499.rs @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0499: cannot borrow as mutable more than once + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0499", + title: LocalizedText::new( + "Cannot borrow as mutable more than once", + "Нельзя заимствовать как изменяемое более одного раза", + "가변으로 두 번 이상 빌릴 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +Rust allows only ONE mutable reference to data at a time. This is stricter +than the immutable borrowing rule and prevents all aliased mutation. + +Why? Two mutable references to the same data could lead to: +- Data races in concurrent code +- Iterator invalidation +- Dangling pointers after reallocation + +This rule is checked at compile time, giving you fearless concurrency.", + "\ +Rust разрешает только ОДНУ изменяемую ссылку на данные одновременно. +Это строже правила неизменяемого заимствования. + +Почему? Две изменяемые ссылки на одни данные могут привести к: +- Гонкам данных в конкурентном коде +- Инвалидации итераторов +- Висячим указателям после реаллокации", + "\ +Rust는 데이터에 대해 한 번에 하나의 가변 참조만 허용합니다. +이는 불변 빌림 규칙보다 엄격합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Use scopes to limit borrow lifetime", + "Использовать области видимости", + "스코프를 사용하여 빌림 수명 제한" + ), + code: "{ let r1 = &mut x; *r1 += 1; } // r1 dropped\nlet r2 = &mut x;" + }, + FixSuggestion { + description: LocalizedText::new( + "Use RefCell for interior mutability", + "Использовать RefCell", + "내부 가변성을 위해 RefCell 사용" + ), + code: "use std::cell::RefCell;\nlet x = RefCell::new(value);" + } + ], + links: &[ + DocLink { + title: "Rust Book: Mutable References", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0499.html" + } + ] +}; diff --git a/masterror-cli/src/errors/borrowing/e0500.rs b/masterror-cli/src/errors/borrowing/e0500.rs new file mode 100644 index 0000000..8721f48 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0500.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0500: closure requires unique access but X is already borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0500", + title: LocalizedText::new( + "Closure requires unique access but value is already borrowed", + "Замыкание требует уникальный доступ, но значение уже заимствовано", + "클로저가 고유 접근을 필요로 하지만 값이 이미 빌려짐" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +A closure that mutates a captured variable needs exclusive access to it. +But you've already borrowed the value elsewhere, creating a conflict. + +Closures that capture by mutable reference act like mutable borrows.", + "\ +Замыкание, изменяющее захваченную переменную, требует эксклюзивного доступа.", + "\ +캡처된 변수를 변경하는 클로저는 독점적인 접근이 필요합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the borrow before the closure", + "Завершить заимствование перед замыканием", + "클로저 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); }\nlet c = || x += 1;" + }, + FixSuggestion { + description: LocalizedText::new( + "Move the value into the closure", + "Переместить значение в замыкание", + "클로저로 값 이동" + ), + code: "let c = move || { x += 1; };" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0500.html" + }] +}; diff --git a/masterror-cli/src/errors/borrowing/e0501.rs b/masterror-cli/src/errors/borrowing/e0501.rs new file mode 100644 index 0000000..34298ab --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0501.rs @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0501: cannot borrow X as mutable because previous closure requires unique +//! access + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0501", + title: LocalizedText::new( + "Cannot borrow because closure requires unique access", + "Нельзя заимствовать, так как замыкание требует уникальный доступ", + "클로저가 고유 접근을 필요로 하여 빌릴 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +A closure has captured a variable mutably, and now you're trying to borrow +that same variable again. The closure's capture acts like a mutable borrow +that lasts for the closure's entire lifetime.", + "\ +Замыкание захватило переменную изменяемо, и теперь вы пытаетесь заимствовать +ту же переменную снова.", + "\ +클로저가 변수를 가변으로 캡처했고, 이제 같은 변수를 다시 빌리려고 합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Use the closure before borrowing again", + "Использовать замыкание перед повторным заимствованием", + "다시 빌리기 전에 클로저 사용" + ), + code: "let mut c = || x += 1;\nc(); // use closure\nlet r = &x; // now safe" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0501.html" + }] +}; diff --git a/masterror-cli/src/errors/borrowing/e0502.rs b/masterror-cli/src/errors/borrowing/e0502.rs new file mode 100644 index 0000000..fa372c0 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0502.rs @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0502: cannot borrow as mutable because also borrowed as immutable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0502", + title: LocalizedText::new( + "Cannot borrow as mutable (already borrowed as immutable)", + "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)", + "가변으로 빌릴 수 없음 (이미 불변으로 빌림)" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +Rust enforces a strict borrowing rule: you can have EITHER one mutable +reference OR any number of immutable references, but never both at once. + +This prevents data races at compile time. If you could mutate data while +someone else is reading it, the reader might see inconsistent state. + +The immutable borrow is still \"active\" because it's used later in code.", + "\ +Rust применяет строгое правило: можно иметь ЛИБО одну изменяемую ссылку, +ЛИБО любое количество неизменяемых, но никогда обе одновременно. + +Это предотвращает гонки данных.", + "\ +Rust는 엄격한 빌림 규칙을 적용합니다: 하나의 가변 참조 또는 여러 불변 참조를 +가질 수 있지만, 동시에 둘 다 가질 수는 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the immutable borrow before mutating", + "Завершить неизменяемое заимствование", + "변경 전에 불변 빌림 종료" + ), + code: "{ let r = &x; println!(\"{}\", r); } // r dropped\nx.push(1);" + }, + FixSuggestion { + description: LocalizedText::new( + "Clone before mutation", + "Клонировать перед изменением", + "변경 전에 복제" + ), + code: "let copy = x[0].clone();\nx.push(copy);" + } + ], + links: &[ + DocLink { + title: "Rust Book: References and Borrowing", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0502.html" + } + ] +}; diff --git a/masterror-cli/src/errors/borrowing/e0503.rs b/masterror-cli/src/errors/borrowing/e0503.rs new file mode 100644 index 0000000..083a5c3 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0503.rs @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0503: cannot use X because it was mutably borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0503", + title: LocalizedText::new( + "Cannot use value because it was mutably borrowed", + "Нельзя использовать значение, так как оно изменяемо заимствовано", + "가변으로 빌려져서 값을 사용할 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +While a mutable borrow is active, you cannot access the original value +in any way. This prevents you from observing partially modified state +or creating aliased mutable references. + +The mutable borrow has exclusive access until it ends.", + "\ +Пока активно изменяемое заимствование, вы не можете обращаться к +исходному значению никак.", + "\ +가변 빌림이 활성화된 동안 원래 값에 어떤 방식으로도 접근할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "End the mutable borrow first", + "Сначала завершить изменяемое заимствование", + "먼저 가변 빌림 종료" + ), + code: "{ let r = &mut x; modify(r); } // r dropped\nuse_value(&x);" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0503.html" + }] +}; diff --git a/masterror-cli/src/errors/borrowing/e0506.rs b/masterror-cli/src/errors/borrowing/e0506.rs new file mode 100644 index 0000000..8c3a482 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0506.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0506: cannot assign to X because it is borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0506", + title: LocalizedText::new( + "Cannot assign because it is borrowed", + "Нельзя присвоить, так как значение заимствовано", + "빌려져 있어서 할당할 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to assign to a value while a borrow of it exists. +This would invalidate the existing reference. + +You must wait for all borrows to end before assigning a new value.", + "\ +Вы пытаетесь присвоить значение, пока существует его заимствование.", + "\ +빌림이 존재하는 동안 값에 할당하려고 합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "End the borrow before assigning", + "Завершить заимствование перед присваиванием", + "할당 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); } // borrow ends\nx = new_value;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0506.html" + }] +}; diff --git a/masterror-cli/src/errors/borrowing/e0508.rs b/masterror-cli/src/errors/borrowing/e0508.rs new file mode 100644 index 0000000..8782534 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0508.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0508: cannot move out of type [T], a non-copy slice + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0508", + title: LocalizedText::new( + "Cannot move out of type, a non-copy slice", + "Нельзя переместить из типа — это не-Copy срез", + "타입에서 이동할 수 없음, 비복사 슬라이스" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to move a value out of a slice, but slices don't own their data. +They're just views into an array or Vec. + +Moving out would leave a \"hole\" in the slice, which isn't allowed.", + "\ +Вы пытаетесь переместить значение из среза, но срезы не владеют данными.", + "\ +슬라이스에서 값을 이동하려고 하지만, 슬라이스는 데이터를 소유하지 않습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Clone the element", + "Клонировать элемент", + "요소 복제" + ), + code: "let elem = slice[i].clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use into_iter() on Vec", + "Использовать into_iter() на Vec", + "Vec에 into_iter() 사용" + ), + code: "for elem in vec.into_iter() { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0508.html" + }] +}; diff --git a/masterror-cli/src/errors/borrowing/e0596.rs b/masterror-cli/src/errors/borrowing/e0596.rs new file mode 100644 index 0000000..3f17af3 --- /dev/null +++ b/masterror-cli/src/errors/borrowing/e0596.rs @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0596: cannot borrow as mutable, as it is not declared as mutable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0596", + title: LocalizedText::new( + "Cannot borrow as mutable (not declared as mutable)", + "Нельзя заимствовать как изменяемое (не объявлено как изменяемое)", + "가변으로 빌릴 수 없음 (가변으로 선언되지 않음)" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to get a mutable reference to something that wasn't declared +as mutable. To modify through a reference, the original binding must be `mut`. + +This is Rust's way of making mutation explicit and visible in the code.", + "\ +Вы пытаетесь получить изменяемую ссылку на то, что не было объявлено +как изменяемое. Для изменения через ссылку оригинал должен быть `mut`.", + "\ +가변으로 선언되지 않은 것에 대한 가변 참조를 얻으려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Add mut to the variable declaration", + "Добавить mut к объявлению переменной", + "변수 선언에 mut 추가" + ), + code: "let mut x = vec![1, 2, 3];" + }, + FixSuggestion { + description: LocalizedText::new( + "Add mut to function parameter", + "Добавить mut к параметру функции", + "함수 매개변수에 mut 추가" + ), + code: "fn process(data: &mut Vec) { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0596.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes.rs b/masterror-cli/src/errors/lifetimes.rs new file mode 100644 index 0000000..8132ece --- /dev/null +++ b/masterror-cli/src/errors/lifetimes.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Lifetime-related errors. + +mod e0106; +mod e0495; +mod e0515; +mod e0597; +mod e0621; +mod e0623; +mod e0700; +mod e0716; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0106::ENTRY, + &e0495::ENTRY, + &e0515::ENTRY, + &e0597::ENTRY, + &e0621::ENTRY, + &e0623::ENTRY, + &e0700::ENTRY, + &e0716::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/lifetimes/e0106.rs b/masterror-cli/src/errors/lifetimes/e0106.rs new file mode 100644 index 0000000..3d10310 --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0106.rs @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0106: missing lifetime specifier + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0106", + title: LocalizedText::new( + "Missing lifetime specifier", + "Отсутствует спецификатор времени жизни", + "라이프타임 지정자 누락" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +References in Rust have lifetimes - they describe how long the reference +is valid. Usually the compiler infers lifetimes, but sometimes you must +be explicit. + +Lifetime annotations don't change how long values live. They describe +relationships between references so the compiler can verify safety.", + "\ +Ссылки в Rust имеют времена жизни — они описывают, как долго ссылка +действительна. Обычно компилятор выводит времена жизни, но иногда нужно +указать явно.", + "\ +Rust의 참조에는 라이프타임이 있습니다 - 참조가 얼마나 오래 유효한지 설명합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Add explicit lifetime parameter", + "Добавить явный параметр времени жизни", + "명시적 라이프타임 매개변수 추가" + ), + code: "struct Foo<'a> { x: &'a str }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use owned type instead", + "Использовать владеющий тип", + "소유 타입 사용" + ), + code: "struct Foo { x: String }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use 'static for compile-time constants", + "Использовать 'static для констант", + "컴파일 시간 상수에 'static 사용" + ), + code: "fn get_str() -> &'static str { \"hello\" }" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0106.html" + } + ] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0495.rs b/masterror-cli/src/errors/lifetimes/e0495.rs new file mode 100644 index 0000000..a5ce0a0 --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0495.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0495: cannot infer an appropriate lifetime + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0495", + title: LocalizedText::new( + "Cannot infer an appropriate lifetime", + "Невозможно вывести подходящее время жизни", + "적절한 라이프타임을 추론할 수 없음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +The compiler found conflicting lifetime requirements and couldn't +determine which one to use.", + "\ +Компилятор обнаружил конфликтующие требования времён жизни.", + "\ +컴파일러가 충돌하는 라이프타임 요구사항을 찾았습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add explicit lifetime bounds", + "Добавить явные ограничения времени жизни", + "명시적 라이프타임 바운드 추가" + ), + code: "fn process<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0495.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0515.rs b/masterror-cli/src/errors/lifetimes/e0515.rs new file mode 100644 index 0000000..f8ca6a2 --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0515.rs @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0515: cannot return reference to temporary value + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0515", + title: LocalizedText::new( + "Cannot return reference to temporary value", + "Нельзя вернуть ссылку на временное значение", + "임시 값에 대한 참조를 반환할 수 없음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +You're trying to return a reference to a value that was created inside +the function. When the function returns, that value is dropped. + +The reference would point to freed memory - a dangling pointer.", + "\ +Вы пытаетесь вернуть ссылку на значение, созданное внутри функции. +При возврате из функции это значение будет уничтожено.", + "\ +함수 내에서 생성된 값에 대한 참조를 반환하려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Return owned value instead of reference", + "Вернуть владеющее значение вместо ссылки", + "참조 대신 소유 값 반환" + ), + code: "fn create() -> String { String::from(\"hello\") }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use a parameter lifetime", + "Использовать время жизни параметра", + "매개변수 라이프타임 사용" + ), + code: "fn longest<'a>(x: &'a str, y: &'a str) -> &'a str" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0515.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0597.rs b/masterror-cli/src/errors/lifetimes/e0597.rs new file mode 100644 index 0000000..bf3f11f --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0597.rs @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0597: value does not live long enough + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0597", + title: LocalizedText::new( + "Value does not live long enough", + "Значение живёт недостаточно долго", + "값이 충분히 오래 살지 않음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +You're creating a reference to something that will be destroyed before +the reference is used. This would create a dangling pointer. + +Rust prevents this at compile time. The referenced value must live at +least as long as the reference itself.", + "\ +Вы создаёте ссылку на что-то, что будет уничтожено до использования ссылки.", + "\ +참조가 사용되기 전에 파괴될 것에 대한 참조를 만들고 있습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Move value to outer scope", + "Переместить значение во внешнюю область", + "값을 외부 스코프로 이동" + ), + code: "let s = String::from(\"hello\"); // declare before use" + }, + FixSuggestion { + description: LocalizedText::new( + "Return owned value instead", + "Вернуть владеющее значение", + "소유 값 반환" + ), + code: "fn get() -> String { s.to_string() }" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0597.html" + } + ] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0621.rs b/masterror-cli/src/errors/lifetimes/e0621.rs new file mode 100644 index 0000000..b7247fc --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0621.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0621: explicit lifetime required in the type of X + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0621", + title: LocalizedText::new( + "Explicit lifetime required in the type", + "Требуется явное время жизни в типе", + "타입에 명시적 라이프타임이 필요함" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +The compiler cannot infer lifetimes in this context. You need to add +explicit lifetime annotations to show how references relate.", + "\ +Компилятор не может вывести времена жизни в этом контексте.", + "\ +컴파일러가 이 컨텍스트에서 라이프타임을 추론할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add lifetime parameter to function", + "Добавить параметр времени жизни к функции", + "함수에 라이프타임 매개변수 추가" + ), + code: "fn process<'a>(data: &'a str) -> &'a str { data }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0621.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0623.rs b/masterror-cli/src/errors/lifetimes/e0623.rs new file mode 100644 index 0000000..152bb3b --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0623.rs @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0623: lifetime mismatch + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0623", + title: LocalizedText::new( + "Lifetime mismatch", + "Несоответствие времён жизни", + "라이프타임 불일치" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +Two lifetimes in your code don't match where they should.", + "\ +Два времени жизни в коде не совпадают там, где должны.", + "\ +코드에서 두 라이프타임이 일치해야 하는 곳에서 일치하지 않습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Ensure consistent lifetime annotations", + "Обеспечить согласованные аннотации", + "일관된 라이프타임 어노테이션 확보" + ), + code: "fn foo<'a>(x: &'a str) -> &'a str { x }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0623.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0700.rs b/masterror-cli/src/errors/lifetimes/e0700.rs new file mode 100644 index 0000000..f0ec8d0 --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0700.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0700: hidden type captures lifetime + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0700", + title: LocalizedText::new( + "Hidden type captures lifetime", + "Скрытый тип захватывает время жизни", + "숨겨진 타입이 라이프타임을 캡처함" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +When using `impl Trait` return type, the hidden concrete type captures +a lifetime that isn't declared in the function signature.", + "\ +При использовании типа возврата `impl Trait` скрытый конкретный тип +захватывает время жизни, не объявленное в сигнатуре.", + "\ +`impl Trait` 반환 타입을 사용할 때, 숨겨진 구체적 타입이 선언되지 않은 라이프타임을 캡처합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Declare the captured lifetime", + "Объявить захваченное время жизни", + "캡처된 라이프타임 선언" + ), + code: "fn foo<'a>(x: &'a str) -> impl Iterator + 'a" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0700.html" + }] +}; diff --git a/masterror-cli/src/errors/lifetimes/e0716.rs b/masterror-cli/src/errors/lifetimes/e0716.rs new file mode 100644 index 0000000..f12a054 --- /dev/null +++ b/masterror-cli/src/errors/lifetimes/e0716.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0716: temporary value dropped while borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0716", + title: LocalizedText::new( + "Temporary value dropped while borrowed", + "Временное значение уничтожено во время заимствования", + "빌린 동안 임시 값이 삭제됨" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +A temporary value was created, borrowed, and then immediately dropped. +The borrow outlives the temporary. + +Temporaries only live until the end of the statement by default.", + "\ +Было создано временное значение, заимствовано и сразу уничтожено.", + "\ +임시 값이 생성되고, 빌려지고, 즉시 삭제되었습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Bind temporary to a variable", + "Привязать временное значение к переменной", + "임시 값을 변수에 바인딩" + ), + code: "let value = create_value();\nlet reference = &value;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0716.html" + }] +}; diff --git a/masterror-cli/src/errors/ownership.rs b/masterror-cli/src/errors/ownership.rs new file mode 100644 index 0000000..516a81b --- /dev/null +++ b/masterror-cli/src/errors/ownership.rs @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Ownership-related errors. + +mod e0381; +mod e0382; +mod e0383; +mod e0384; +mod e0505; +mod e0507; +mod e0509; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0381::ENTRY, + &e0382::ENTRY, + &e0383::ENTRY, + &e0384::ENTRY, + &e0505::ENTRY, + &e0507::ENTRY, + &e0509::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/ownership/e0381.rs b/masterror-cli/src/errors/ownership/e0381.rs new file mode 100644 index 0000000..8518c29 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0381.rs @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0381: borrow of possibly-uninitialized variable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0381", + title: LocalizedText::new( + "Borrow of possibly-uninitialized variable", + "Заимствование возможно неинициализированной переменной", + "초기화되지 않았을 수 있는 변수의 빌림" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Rust requires all variables to be initialized before use. You're trying +to use a variable that might not have been assigned a value yet. + +This prevents reading garbage memory. The compiler tracks initialization +through all possible code paths.", + "\ +Rust требует инициализации всех переменных перед использованием. +Вы пытаетесь использовать переменную, которая может быть не инициализирована. + +Это предотвращает чтение мусора из памяти.", + "\ +Rust는 사용 전에 모든 변수를 초기화해야 합니다. +아직 값이 할당되지 않았을 수 있는 변수를 사용하려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Initialize the variable", + "Инициализировать переменную", + "변수 초기화" + ), + code: "let x = 0; // or any default value" + }, + FixSuggestion { + description: LocalizedText::new( + "Use Option for maybe-uninitialized", + "Использовать Option для возможно неинициализированных", + "초기화되지 않을 수 있는 경우 Option 사용" + ), + code: "let x: Option = None;\nif condition { x = Some(42); }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0381.html" + }] +}; diff --git a/masterror-cli/src/errors/ownership/e0382.rs b/masterror-cli/src/errors/ownership/e0382.rs new file mode 100644 index 0000000..f5371d6 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0382.rs @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0382: borrow of moved value + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0382", + title: LocalizedText::new( + "Borrow of moved value", + "Заимствование перемещённого значения", + "이동된 값의 빌림" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +In Rust, each value has exactly one owner at a time. This is the foundation +of Rust's memory safety guarantees without garbage collection. + +When you assign a value to another variable or pass it to a function, +ownership MOVES to the new location. The original variable becomes invalid +and cannot be used anymore. + +This happens because Rust needs to know exactly when to free memory. +With one owner, there's no ambiguity about who is responsible for cleanup.", + "\ +В Rust каждое значение имеет ровно одного владельца. Это основа +гарантий безопасности памяти без сборщика мусора. + +Когда вы присваиваете значение другой переменной или передаёте в функцию, +владение ПЕРЕМЕЩАЕТСЯ. Исходная переменная становится недействительной. + +Rust должен точно знать, когда освобождать память. +С одним владельцем нет неоднозначности в том, кто отвечает за очистку.", + "\ +Rust에서 각 값은 정확히 하나의 소유자를 가집니다. 이것이 가비지 컬렉터 없이 +메모리 안전성을 보장하는 기반입니다. + +값을 다른 변수에 할당하거나 함수에 전달하면 소유권이 새 위치로 이동합니다. +원래 변수는 무효화되어 더 이상 사용할 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Clone the value (creates a deep copy)", + "Клонировать значение (глубокая копия)", + "값을 복제 (깊은 복사)" + ), + code: "let s2 = s.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Borrow with a reference (no copy)", + "Заимствовать по ссылке (без копии)", + "참조로 빌림 (복사 없음)" + ), + code: "let s2 = &s;" + }, + FixSuggestion { + description: LocalizedText::new( + "Implement Copy trait (for small types)", + "Реализовать Copy (для маленьких типов)", + "Copy 트레이트 구현 (작은 타입용)" + ), + code: "#[derive(Copy, Clone)]" + } + ], + links: &[ + DocLink { + title: "Rust Book: Ownership", + url: "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0382.html" + } + ] +}; diff --git a/masterror-cli/src/errors/ownership/e0383.rs b/masterror-cli/src/errors/ownership/e0383.rs new file mode 100644 index 0000000..ebf37f9 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0383.rs @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0383: partial reinitialization of uninitialized structure + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0383", + title: LocalizedText::new( + "Partial reinitialization of uninitialized structure", + "Частичная переинициализация неинициализированной структуры", + "초기화되지 않은 구조체의 부분 재초기화" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to partially reinitialize a struct that was moved from. +After a move, the entire struct is invalid - you can't assign to just +one field. + +You must reinitialize the entire struct.", + "\ +Вы пытаетесь частично переинициализировать структуру после перемещения. +После перемещения вся структура недействительна - нельзя присвоить +только одно поле. + +Нужно переинициализировать всю структуру.", + "\ +이동된 구조체를 부분적으로 재초기화하려고 합니다. +이동 후 전체 구조체가 무효화됩니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Reinitialize the entire struct", + "Переинициализировать всю структуру", + "전체 구조체 재초기화" + ), + code: "s = MyStruct { field1: val1, field2: val2 };" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0383.html" + }] +}; diff --git a/masterror-cli/src/errors/ownership/e0384.rs b/masterror-cli/src/errors/ownership/e0384.rs new file mode 100644 index 0000000..19696a4 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0384.rs @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0384: cannot assign twice to immutable variable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0384", + title: LocalizedText::new( + "Cannot assign twice to immutable variable", + "Нельзя присвоить дважды неизменяемой переменной", + "불변 변수에 두 번 할당할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Variables in Rust are immutable by default. Once a value is bound to a name, +you cannot change it unless you explicitly mark it as mutable with `mut`. + +This is a deliberate design choice that makes code easier to reason about. +When you see a variable without `mut`, you know it won't change.", + "\ +Переменные в Rust неизменяемы по умолчанию. После привязки значения +к имени вы не можете его изменить без явного указания `mut`. + +Это осознанное решение, упрощающее понимание кода. +Если переменная без `mut`, она не изменится.", + "\ +Rust의 변수는 기본적으로 불변입니다. 값이 이름에 바인딩되면 +`mut`로 명시적으로 표시하지 않는 한 변경할 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Make the variable mutable", + "Сделать переменную изменяемой", + "변수를 가변으로 만들기" + ), + code: "let mut x = 5;\nx = 10;" + }, + FixSuggestion { + description: LocalizedText::new( + "Use shadowing (create new binding)", + "Использовать затенение (новая привязка)", + "섀도잉 사용 (새 바인딩 생성)" + ), + code: "let x = 5;\nlet x = 10; // shadows the first x" + } + ], + links: &[ + DocLink { + title: "Rust Book: Variables and Mutability", + url: "https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0384.html" + } + ] +}; diff --git a/masterror-cli/src/errors/ownership/e0505.rs b/masterror-cli/src/errors/ownership/e0505.rs new file mode 100644 index 0000000..e76eec9 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0505.rs @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0505: cannot move out of X because it is borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0505", + title: LocalizedText::new( + "Cannot move out because it is borrowed", + "Нельзя переместить, так как значение заимствовано", + "빌려져 있어서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to move a value while a borrow of it still exists. +This would invalidate the reference, creating a dangling pointer. + +The borrow must end (go out of scope) before you can move the value. + +Rust tracks the lifetime of all borrows to prevent this at compile time.", + "\ +Вы пытаетесь переместить значение, пока существует его заимствование. +Это сделает ссылку недействительной. + +Заимствование должно закончиться до перемещения значения.", + "\ +빌림이 존재하는 동안 값을 이동하려고 합니다. +이것은 참조를 무효화하여 댕글링 포인터를 만듭니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the borrow before moving", + "Завершить заимствование перед перемещением", + "이동 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); } // borrow ends\nmove_value(x);" + }, + FixSuggestion { + description: LocalizedText::new( + "Clone before borrowing", + "Клонировать перед заимствованием", + "빌리기 전에 복제" + ), + code: "let cloned = x.clone();\nlet r = &cloned;\nmove_value(x);" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0505.html" + }] +}; diff --git a/masterror-cli/src/errors/ownership/e0507.rs b/masterror-cli/src/errors/ownership/e0507.rs new file mode 100644 index 0000000..3df095f --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0507.rs @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0507: cannot move out of borrowed content + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0507", + title: LocalizedText::new( + "Cannot move out of borrowed content", + "Нельзя переместить из заимствованного содержимого", + "빌린 내용에서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to take ownership of a value that you only have a reference to. +References are borrows - they don't own the data. + +Moving out of a reference would leave the original owner with invalid data, +violating Rust's memory safety guarantees. + +Common cases: +- Indexing into a Vec or array with `vec[i]` and trying to own the element +- Dereferencing a reference and trying to move the value +- Pattern matching on borrowed data with ownership patterns", + "\ +Вы пытаетесь забрать владение значением, на которое у вас только ссылка. +Ссылки - это заимствования, они не владеют данными. + +Перемещение из ссылки оставит исходного владельца с недействительными данными. + +Частые случаи: +- Индексация Vec с попыткой забрать элемент +- Разыменование ссылки с попыткой переместить +- Pattern matching на заимствованных данных", + "\ +참조만 있는 값의 소유권을 가져오려고 합니다. +참조는 빌림입니다 - 데이터를 소유하지 않습니다. + +참조에서 이동하면 원래 소유자가 무효한 데이터를 갖게 됩니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Clone the value", "Клонировать значение", "값 복제"), + code: "let owned = borrowed.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use mem::take or mem::replace", + "Использовать mem::take или mem::replace", + "mem::take 또는 mem::replace 사용" + ), + code: "let owned = std::mem::take(&mut vec[i]);" + }, + FixSuggestion { + description: LocalizedText::new( + "Use swap_remove for Vec", + "Использовать swap_remove для Vec", + "Vec에 swap_remove 사용" + ), + code: "let owned = vec.swap_remove(i);" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0507.html" + }] +}; diff --git a/masterror-cli/src/errors/ownership/e0509.rs b/masterror-cli/src/errors/ownership/e0509.rs new file mode 100644 index 0000000..4d39ab1 --- /dev/null +++ b/masterror-cli/src/errors/ownership/e0509.rs @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0509: cannot move out of type X, which implements the Drop trait + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0509", + title: LocalizedText::new( + "Cannot move out of type which implements Drop", + "Нельзя переместить из типа, реализующего Drop", + "Drop을 구현하는 타입에서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Types that implement Drop have custom cleanup logic that runs when they're +destroyed. Moving a field out would leave the struct in a partially valid +state, and Drop wouldn't know what to clean up. + +Rust prevents this to ensure Drop always sees a valid value.", + "\ +Типы с Drop имеют пользовательскую логику очистки при уничтожении. +Перемещение поля оставит структуру в частично валидном состоянии, +и Drop не будет знать, что очищать. + +Rust предотвращает это для гарантии валидности значения в Drop.", + "\ +Drop을 구현하는 타입은 파괴될 때 실행되는 사용자 정의 정리 로직이 있습니다. +필드를 이동하면 구조체가 부분적으로 유효한 상태가 됩니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Clone the field", "Клонировать поле", "필드 복제"), + code: "let field = self.field.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use Option and take()", + "Использовать Option и take()", + "Option과 take() 사용" + ), + code: "struct S { field: Option }\nlet field = self.field.take();" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0509.html" + }] +}; diff --git a/masterror-cli/src/errors/raprogramm.rs b/masterror-cli/src/errors/raprogramm.rs new file mode 100644 index 0000000..6b61b47 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm.rs @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Best practices from RAprogramm's RustManifest. +//! +//! These are not compiler errors but recommendations and patterns +//! from + +mod ra001; +mod ra002; +mod ra003; +mod ra004; +mod ra005; +mod ra006; +mod ra007; +mod ra008; +mod ra009; +mod ra010; +mod ra011; +mod ra012; +mod ra013; +mod ra014; +mod ra015; + +pub use crate::errors::LocalizedText; + +/// Best practice category. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum PracticeCategory { + ErrorHandling, + Performance, + Naming, + Documentation, + Design, + Testing, + Security +} + +impl PracticeCategory { + pub fn name(&self, lang: &str) -> &'static str { + match (self, lang) { + (Self::ErrorHandling, "ru") => "Обработка ошибок", + (Self::ErrorHandling, "ko") => "오류 처리", + (Self::ErrorHandling, _) => "Error Handling", + + (Self::Performance, "ru") => "Производительность", + (Self::Performance, "ko") => "성능", + (Self::Performance, _) => "Performance", + + (Self::Naming, "ru") => "Именование", + (Self::Naming, "ko") => "명명", + (Self::Naming, _) => "Naming", + + (Self::Documentation, "ru") => "Документация", + (Self::Documentation, "ko") => "문서화", + (Self::Documentation, _) => "Documentation", + + (Self::Design, "ru") => "Проектирование", + (Self::Design, "ko") => "설계", + (Self::Design, _) => "Design", + + (Self::Testing, "ru") => "Тестирование", + (Self::Testing, "ko") => "테스트", + (Self::Testing, _) => "Testing", + + (Self::Security, "ru") => "Безопасность", + (Self::Security, "ko") => "보안", + (Self::Security, _) => "Security" + } + } +} + +/// A best practice recommendation. +#[derive(Debug, Clone)] +pub struct BestPractice { + pub code: &'static str, + pub title: LocalizedText, + pub category: PracticeCategory, + pub explanation: LocalizedText, + pub good_example: &'static str, + pub bad_example: &'static str, + pub source: &'static str +} + +static ENTRIES: &[&BestPractice] = &[ + &ra001::ENTRY, + &ra002::ENTRY, + &ra003::ENTRY, + &ra004::ENTRY, + &ra005::ENTRY, + &ra006::ENTRY, + &ra007::ENTRY, + &ra008::ENTRY, + &ra009::ENTRY, + &ra010::ENTRY, + &ra011::ENTRY, + &ra012::ENTRY, + &ra013::ENTRY, + &ra014::ENTRY, + &ra015::ENTRY +]; + +pub fn entries() -> &'static [&'static BestPractice] { + ENTRIES +} + +/// Registry for best practices. +pub struct PracticeRegistry { + practices: std::collections::HashMap<&'static str, &'static BestPractice> +} + +impl PracticeRegistry { + /// Build registry from all practices. + pub fn new() -> Self { + let mut practices = std::collections::HashMap::new(); + for entry in entries() { + practices.insert(entry.code, *entry); + } + Self { + practices + } + } + + /// Find practice by code (RA001, etc.). + pub fn find(&self, code: &str) -> Option<&'static BestPractice> { + let normalized = code.to_uppercase(); + self.practices.get(normalized.as_str()).copied() + } + + /// Get all practices. + pub fn all(&self) -> impl Iterator + '_ { + self.practices.values().copied() + } + + /// Get practices by category. + pub fn by_category(&self, cat: PracticeCategory) -> Vec<&'static BestPractice> { + self.practices + .values() + .filter(|p| p.category == cat) + .copied() + .collect() + } +} + +impl Default for PracticeRegistry { + fn default() -> Self { + Self::new() + } +} diff --git a/masterror-cli/src/errors/raprogramm/ra001.rs b/masterror-cli/src/errors/raprogramm/ra001.rs new file mode 100644 index 0000000..774eed4 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra001.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA001: Never use unwrap() in production code + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA001", + title: LocalizedText::new( + "Never use unwrap() in production code", + "Никогда не используйте unwrap() в продакшене", + "프로덕션 코드에서 unwrap() 사용 금지" + ), + category: PracticeCategory::ErrorHandling, + explanation: LocalizedText::new( + "\ +The Cloudflare November 2025 outage affected 330+ datacenters due to a single +.unwrap(). Configuration change exposed an error case that was never handled. +Result: ChatGPT, X, Canva offline for ~3 hours. + +Always use proper error propagation with Result and the ? operator. +Implement detailed error messages with map_err().", + "\ +Сбой Cloudflare в ноябре 2025 затронул 330+ дата-центров из-за одного .unwrap(). +Изменение конфигурации обнажило случай ошибки, который не был обработан. +Результат: ChatGPT, X, Canva недоступны ~3 часа. + +Всегда используйте правильное распространение ошибок с Result и оператором ?.", + "\ +2025년 11월 Cloudflare 장애는 단일 .unwrap()으로 인해 330개 이상의 데이터센터에 +영향을 미쳤습니다. 구성 변경으로 처리되지 않은 오류 케이스가 노출되었습니다." + ), + good_example: r#"let config = Config::from_file("config.toml") + .map_err(|e| format!("Failed to load config: {}", e))?;"#, + bad_example: r#"let config = Config::from_file("config.toml").unwrap();"#, + source: "https://github.com/RAprogramm/RustManifest#6-panic-avoidance-in-production" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra002.rs b/masterror-cli/src/errors/raprogramm/ra002.rs new file mode 100644 index 0000000..52c5391 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra002.rs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA002: Use ? operator for error propagation + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA002", + title: LocalizedText::new( + "Use ? operator for error propagation", + "Используйте оператор ? для распространения ошибок", + "오류 전파에 ? 연산자 사용" + ), + category: PracticeCategory::ErrorHandling, + explanation: LocalizedText::new( + "\ +The ? operator is the idiomatic way to handle errors in Rust. +It automatically converts errors and propagates them up the call stack. + +Use ok_or() or ok_or_else() to convert Option to Result with meaningful messages.", + "\ +Оператор ? — идиоматический способ обработки ошибок в Rust. +Он автоматически конвертирует ошибки и распространяет их вверх по стеку вызовов.", + "\ +? 연산자는 Rust에서 오류를 처리하는 관용적인 방법입니다." + ), + good_example: r#"let value = some_option.ok_or("Expected a value")?; +let data = fetch_data().map_err(|e| AppError::Network(e))?;"#, + bad_example: r#"let value = some_option.unwrap(); +let data = fetch_data().expect("fetch failed");"#, + source: "https://github.com/RAprogramm/RustManifest#5-best-practices" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra003.rs b/masterror-cli/src/errors/raprogramm/ra003.rs new file mode 100644 index 0000000..14b249c --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra003.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA003: Avoid unnecessary clone() calls + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA003", + title: LocalizedText::new( + "Avoid unnecessary clone() calls", + "Избегайте ненужных вызовов clone()", + "불필요한 clone() 호출 피하기" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +Cloning allocates memory and copies data. Often you can use references instead. +Only clone when you actually need ownership of the data. + +Common anti-patterns: +- Cloning just to satisfy the borrow checker (restructure instead) +- Cloning in a loop (clone once before the loop) +- Cloning when a reference would work", + "\ +Клонирование выделяет память и копирует данные. Часто можно использовать ссылки. +Клонируйте только когда действительно нужно владение данными.", + "\ +클론은 메모리를 할당하고 데이터를 복사합니다. 종종 참조를 대신 사용할 수 있습니다." + ), + good_example: r#"fn process(data: &str) { /* use reference */ } +let owned = expensive_data.clone(); // clone once +for item in &items { process(item); }"#, + bad_example: r#"for item in items { + process(item.clone()); // clones every iteration! +}"#, + source: "https://github.com/RAprogramm/RustManifest#3-code-quality" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra004.rs b/masterror-cli/src/errors/raprogramm/ra004.rs new file mode 100644 index 0000000..ab1caae --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra004.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA004: Use descriptive, meaningful names + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA004", + title: LocalizedText::new( + "Use descriptive, meaningful names", + "Используйте описательные, значимые имена", + "설명적이고 의미 있는 이름 사용" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Names must reflect purpose. Avoid generic terms like 'create', 'handle', 'data'. +Descriptive names reduce ambiguity, facilitate easier onboarding, and improve +maintainability. + +Conventions: +- snake_case for variables and functions +- PascalCase for structs and enums +- SCREAMING_SNAKE_CASE for constants", + "\ +Имена должны отражать назначение. Избегайте общих терминов вроде 'create', 'handle', 'data'. +Описательные имена уменьшают неоднозначность и улучшают поддерживаемость.", + "\ +이름은 목적을 반영해야 합니다. 'create', 'handle', 'data' 같은 일반적인 용어를 피하세요." + ), + good_example: r#"fn create_user_handler(req: CreateUserRequest) -> Result +const MAX_RETRY_ATTEMPTS: u32 = 3; +struct UserAuthenticationService { ... }"#, + bad_example: r#"fn create(r: Request) -> Result +const MAX: u32 = 3; +struct Service { ... }"#, + source: "https://github.com/RAprogramm/RustManifest#2-naming-conventions" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra005.rs b/masterror-cli/src/errors/raprogramm/ra005.rs new file mode 100644 index 0000000..0087cc2 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra005.rs @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA005: No inline comments - use docblocks only + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA005", + title: LocalizedText::new( + "No inline comments - use docblocks only", + "Никаких инлайн комментариев - только docblocks", + "인라인 주석 금지 - docblock만 사용" + ), + category: PracticeCategory::Documentation, + explanation: LocalizedText::new( + "\ +Avoid // and /* */ explanations in code. All documentation lives in docblocks: +/// for items, //! for modules. + +Standardized headings for IDE/LSP stability: +- # Overview - Short purpose statement +- # Examples - Minimal, compilable samples +- # Errors - Precise failure modes for Result types +- # Panics - Only if unavoidable +- # Safety - Required if unsafe code present", + "\ +Избегайте // и /* */ объяснений в коде. Вся документация живёт в docblocks: +/// для элементов, //! для модулей.", + "\ +코드에서 // 및 /* */ 설명을 피하세요. 모든 문서는 docblock에." + ), + good_example: r#"/// Fetches user data from the database. +/// +/// # Errors +/// Returns `DbError::NotFound` if user doesn't exist. +/// +/// # Examples +/// ``` +/// let user = fetch_user(42)?; +/// ``` +pub fn fetch_user(id: u64) -> Result"#, + bad_example: r#"// This function fetches user data from the database +// It returns an error if user is not found +pub fn fetch_user(id: u64) -> Result"#, + source: "https://github.com/RAprogramm/RustManifest#8-code-documentation" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra006.rs b/masterror-cli/src/errors/raprogramm/ra006.rs new file mode 100644 index 0000000..ae7a5e1 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra006.rs @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA006: Entity naming - no -er suffixes + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA006", + title: LocalizedText::new( + "Entity naming: avoid -er, -or, -manager suffixes", + "Именование сущностей: избегайте суффиксов -er, -or, -manager", + "엔티티 명명: -er, -or, -manager 접미사 피하기" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Structures represent entities, not actions. The -er suffix encourages procedural +thinking that separates data from behavior, creating anemic domain models. +Entity naming naturally unifies data and operations. + +Transforms: +- ConfigLoader → Config +- MessageParser → Message +- RequestHandler → Request +- DataValidator → Data +- ConnectionManager → ConnectionPool + +Exceptions: Iterator, Builder, Visitor, Formatter (established patterns).", + "\ +Структуры представляют сущности, не действия. Суффикс -er поощряет процедурное +мышление, разделяющее данные и поведение. Именование сущностей объединяет их.", + "\ +구조체는 동작이 아닌 엔티티를 나타냅니다. -er 접미사는 절차적 사고를 장려합니다." + ), + good_example: r#"struct Config { ... } +struct Message { ... } +struct Request { ... } +struct ConnectionPool { ... }"#, + bad_example: r#"struct ConfigLoader { ... } +struct MessageParser { ... } +struct RequestHandler { ... } +struct ConnectionManager { ... }"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#1-entity-naming" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra007.rs b/masterror-cli/src/errors/raprogramm/ra007.rs new file mode 100644 index 0000000..b585557 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra007.rs @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA007: Method naming - nouns for accessors, verbs for mutators + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA007", + title: LocalizedText::new( + "Method naming: nouns for accessors, verbs for mutators", + "Именование методов: существительные для accessors, глаголы для mutators", + "메서드 명명: accessor는 명사, mutator는 동사" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Method names reflect purpose through grammatical form: +- Accessors (nouns): name(), length(), value() — not get_name() +- Predicates (adjectives): empty(), valid(), published() — not is_empty() +- Mutators (verbs): save(), publish(), delete() + +The get_ prefix adds noise without information. Omitting verbs signals pure +accessors. Adjective predicates read more naturally than is_ constructions.", + "\ +Имена методов отражают назначение через грамматическую форму: +- Accessors: name(), length() — не get_name() +- Predicates: empty(), valid() — не is_empty() +- Mutators: save(), publish(), delete()", + "\ +메서드 이름은 문법적 형태로 목적을 반영합니다." + ), + good_example: r#"impl User { + fn name(&self) -> &str { &self.name } + fn empty(&self) -> bool { self.data.is_empty() } + fn save(&mut self) { ... } +}"#, + bad_example: r#"impl User { + fn get_name(&self) -> &str { &self.name } + fn is_empty(&self) -> bool { self.data.is_empty() } +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#2-method-naming" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra008.rs b/masterror-cli/src/errors/raprogramm/ra008.rs new file mode 100644 index 0000000..9439153 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra008.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA008: Structure size - maximum 4 fields + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA008", + title: LocalizedText::new( + "Structure size: maximum 4 fields", + "Размер структуры: максимум 4 поля", + "구조체 크기: 최대 4개 필드" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +A structure should have no more than 4 fields. More fields indicate multiple +responsibilities requiring composition. + +Problems with large structures: +- Complex testing with many combinations +- Changes ripple through unrelated code +- Purpose becomes unclear +- Parts cannot be reused independently + +Solution: Decompose into focused sub-structures.", + "\ +Структура должна иметь не более 4 полей. Больше полей указывает на +множественные ответственности, требующие композиции.", + "\ +구조체는 4개 이하의 필드를 가져야 합니다. 더 많은 필드는 분해가 필요함을 나타냅니다." + ), + good_example: r#"struct User { + identity: UserIdentity, + credentials: Credentials, + profile: UserProfile, + access: AccessControl, +}"#, + bad_example: r#"struct User { + id: u64, email: String, password_hash: String, + name: String, avatar: Option, bio: String, + created_at: DateTime, updated_at: DateTime, + role: Role, permissions: Vec, + last_login: Option, login_count: u32, + is_verified: bool, verification_token: Option, +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#3-structure-size" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra009.rs b/masterror-cli/src/errors/raprogramm/ra009.rs new file mode 100644 index 0000000..91573b8 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra009.rs @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA009: Public API size - maximum 5 methods + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA009", + title: LocalizedText::new( + "Public API size: maximum 5 methods", + "Размер публичного API: максимум 5 методов", + "공개 API 크기: 최대 5개 메서드" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +A structure's public interface should have no more than 5 methods. +More methods signal the structure does too much. + +Large APIs indicate mixed responsibilities, forcing users to understand more, +expanding documentation and testing complexity. + +Solution: Extract secondary concerns into separate types. +Excludes: trait implementations (Display, Debug, From) and generic new().", + "\ +Публичный интерфейс структуры должен иметь не более 5 методов. +Больше методов означает, что структура делает слишком много.", + "\ +구조체의 공개 인터페이스는 5개 이하의 메서드를 가져야 합니다." + ), + good_example: r#"impl Document { + pub fn new() -> Self { ... } + pub fn load(path: &Path) -> Result { ... } + pub fn save(&self) -> Result<()> { ... } + pub fn content(&self) -> &str { ... } + pub fn metadata(&self) -> &Metadata { ... } +} + +// Rendering is separate +impl Renderer { ... } +// Export is separate +impl Exporter { ... }"#, + bad_example: r#"impl Document { + pub fn new() -> Self { ... } + pub fn load() -> Result { ... } + pub fn save() -> Result<()> { ... } + pub fn content(&self) -> &str { ... } + pub fn metadata(&self) -> &Metadata { ... } + pub fn render_html(&self) -> String { ... } + pub fn render_pdf(&self) -> Vec { ... } + pub fn export_json(&self) -> String { ... } + pub fn validate(&self) -> Result<()> { ... } + // ... 10+ more methods +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#4-public-api-size" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra010.rs b/masterror-cli/src/errors/raprogramm/ra010.rs new file mode 100644 index 0000000..16397f6 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra010.rs @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA010: Constructors should only assign fields + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA010", + title: LocalizedText::new( + "Constructors: assignment only, no logic", + "Конструкторы: только присваивание, никакой логики", + "생성자: 할당만, 로직 없음" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Constructors should only assign fields. All processing, validation, and I/O +belong in methods. + +Problems with logic in constructors: +- Constructors can fail, complicating object creation +- Work happens eagerly even if unused +- Inflexible creation paths +- Hard to test without real resources + +Benefits of assignment-only constructors: +- Infallible object creation +- Lazy evaluation of expensive work +- Multiple creation paths (from_data() for tests)", + "\ +Конструкторы должны только присваивать поля. Вся обработка, валидация и I/O +принадлежат методам.", + "\ +생성자는 필드만 할당해야 합니다. 모든 처리, 검증, I/O는 메서드에." + ), + good_example: r#"impl Server { + pub fn new(config: Config) -> Self { + Self { config, connection: None } + } + + pub fn connect(&mut self) -> Result<()> { + self.connection = Some(Connection::establish(&self.config)?); + Ok(()) + } +}"#, + bad_example: r#"impl Server { + pub fn new(config: Config) -> Result { + let connection = Connection::establish(&config)?; // I/O in constructor! + validate_config(&config)?; // Logic in constructor! + Ok(Self { config, connection }) + } +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#5-constructor-design" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra011.rs b/masterror-cli/src/errors/raprogramm/ra011.rs new file mode 100644 index 0000000..a837c1b --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra011.rs @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA011: Immutability first - prefer self over &mut self + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA011", + title: LocalizedText::new( + "Immutability first: prefer self over &mut self", + "Сначала неизменяемость: предпочитайте self вместо &mut self", + "불변성 우선: &mut self보다 self 선호" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Prefer returning new objects over mutating existing ones. Use `self` instead +of `&mut self` where practical. + +Problems with mutable objects: +- Shared state bugs from unexpected modifications +- Thread safety requires synchronization +- Temporal coupling makes operation order matter +- Incomplete state during configuration + +Exceptions: Large data structures, I/O, performance-critical loops, Iterator::next", + "\ +Предпочитайте возврат новых объектов вместо изменения существующих. +Используйте `self` вместо `&mut self` где возможно.", + "\ +기존 객체를 변경하는 것보다 새 객체를 반환하는 것을 선호하세요." + ), + good_example: r#"Request::new(url) + .header("Content-Type", "application/json") + .body(payload) + .send()"#, + bad_example: r#"let mut req = Request::new(url); +req.set_header("Content-Type", "application/json"); +req.set_body(payload); +req.send()"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#7-immutability-first" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra012.rs b/masterror-cli/src/errors/raprogramm/ra012.rs new file mode 100644 index 0000000..8274d8c --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra012.rs @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA012: Constant encapsulation - associate with types + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA012", + title: LocalizedText::new( + "Encapsulate constants in their types", + "Инкапсулируйте константы в их типы", + "상수를 타입에 캡슐화" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Constants belong to structures using them, not global scope. This improves +discoverability and prevents namespace pollution. + +Benefits: +- Clear discovery location +- Built-in documentation +- Automatic namespacing +- Encapsulation +- Easy refactoring", + "\ +Константы принадлежат структурам, которые их используют, а не глобальной области. +Это улучшает обнаруживаемость и предотвращает загрязнение пространства имён.", + "\ +상수는 전역 범위가 아닌 사용하는 구조체에 속합니다." + ), + good_example: r#"impl ConnectionPool { + pub const MAX_SIZE: usize = 100; +} + +impl Client { + pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); +} + +// Usage: ConnectionPool::MAX_SIZE"#, + bad_example: r#"const MAX_POOL_SIZE: usize = 100; +const DEFAULT_CLIENT_TIMEOUT: Duration = Duration::from_secs(30); +const MAX_RETRIES: u32 = 3; +const DEFAULT_PORT: u16 = 8080; +// ... scattered constants"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#8-constant-encapsulation" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra013.rs b/masterror-cli/src/errors/raprogramm/ra013.rs new file mode 100644 index 0000000..306b810 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra013.rs @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA013: Testing with fakes over mocks + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA013", + title: LocalizedText::new( + "Use fakes over mocks for testing", + "Используйте fakes вместо mocks для тестирования", + "테스트에 mock보다 fake 사용" + ), + category: PracticeCategory::Testing, + explanation: LocalizedText::new( + "\ +Use simple fake implementations instead of mock libraries. Fakes provide real +behavior; mocks verify call sequences. + +| Aspect | Mocks | Fakes | +|--------|-------|-------| +| Coupling | High | Low | +| Maintenance | Breaks on refactoring | Survives changes | +| Behavior | Simulates | Provides real | +| Debugging | Cryptic | Standard | + +Mock appropriateness: Verifying external system interactions, ensuring methods +are NOT called, testing strict interaction ordering.", + "\ +Используйте простые fake-реализации вместо mock-библиотек. Fakes обеспечивают +реальное поведение; mocks проверяют последовательности вызовов.", + "\ +mock 라이브러리 대신 간단한 fake 구현을 사용하세요." + ), + good_example: r#"struct FakeDatabase { + users: HashMap, +} + +impl FakeDatabase { + fn new() -> Self { Self { users: HashMap::new() } } + fn insert(&mut self, user: User) { self.users.insert(user.id, user); } +} + +impl Database for FakeDatabase { + fn find_user(&self, id: u64) -> Option<&User> { + self.users.get(&id) + } +}"#, + bad_example: r#"#[test] +fn test_user_service() { + let mut mock = MockDatabase::new(); + mock.expect_find_user() + .with(eq(42)) + .times(1) + .returning(|_| Some(User::default())); + // Breaks when implementation changes +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#9-testing-with-fakes" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra014.rs b/masterror-cli/src/errors/raprogramm/ra014.rs new file mode 100644 index 0000000..4301b08 --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra014.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA014: Pre-allocate with Vec::with_capacity + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA014", + title: LocalizedText::new( + "Pre-allocate with Vec::with_capacity", + "Предвыделяйте память с Vec::with_capacity", + "Vec::with_capacity로 사전 할당" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +When you know the approximate size of a Vec, pre-allocate to avoid reallocations. +Each reallocation copies all existing elements to new memory. + +This is especially important in hot paths and loops.", + "\ +Когда знаете примерный размер Vec, предвыделяйте чтобы избежать реаллокаций. +Каждая реаллокация копирует все элементы в новую память.", + "\ +Vec의 대략적인 크기를 알 때, 재할당을 피하기 위해 사전 할당하세요." + ), + good_example: r#"let mut results = Vec::with_capacity(items.len()); +for item in items { + results.push(process(item)); +}"#, + bad_example: r#"let mut results = Vec::new(); // starts with 0 capacity +for item in items { + results.push(process(item)); // reallocates multiple times! +}"#, + source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" +}; diff --git a/masterror-cli/src/errors/raprogramm/ra015.rs b/masterror-cli/src/errors/raprogramm/ra015.rs new file mode 100644 index 0000000..0bfd79c --- /dev/null +++ b/masterror-cli/src/errors/raprogramm/ra015.rs @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA015: Avoid O(n²) algorithms + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA015", + title: LocalizedText::new( + "Avoid O(n²) algorithms", + "Избегайте алгоритмов O(n²)", + "O(n²) 알고리즘 피하기" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +Nested loops over the same data often indicate O(n²) complexity. +Use HashSet/HashMap for lookups, or sort + binary search. + +What looks fine with 100 items becomes unusable with 10,000.", + "\ +Вложенные циклы по одним данным часто указывают на O(n²) сложность. +Используйте HashSet/HashMap для поиска или сортировку + бинарный поиск.", + "\ +같은 데이터에 대한 중첩 루프는 종종 O(n²) 복잡도를 나타냅니다." + ), + good_example: r#"let seen: HashSet<_> = items.iter().collect(); +for item in other_items { + if seen.contains(&item) { // O(1) lookup + // ... + } +}"#, + bad_example: r#"for item in other_items { + for existing in &items { // O(n) for each = O(n²) total + if item == existing { + // ... + } + } +}"#, + source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" +}; diff --git a/masterror-cli/src/errors/resolution.rs b/masterror-cli/src/errors/resolution.rs new file mode 100644 index 0000000..42f17d8 --- /dev/null +++ b/masterror-cli/src/errors/resolution.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Name resolution errors. + +mod e0412; +mod e0425; +mod e0433; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0412::ENTRY, &e0425::ENTRY, &e0433::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/resolution/e0412.rs b/masterror-cli/src/errors/resolution/e0412.rs new file mode 100644 index 0000000..32a9aa1 --- /dev/null +++ b/masterror-cli/src/errors/resolution/e0412.rs @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0412", + title: LocalizedText::new( + "Cannot find type in this scope", + "Не удаётся найти тип в этой области видимости", + "이 스코프에서 타입을 찾을 수 없음" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "The type you're referencing doesn't exist or isn't in scope.", + "Тип, на который вы ссылаетесь, не существует или не в области видимости.", + "참조하는 타입이 존재하지 않거나 스코프에 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new("Import the type", "Импортировать тип", "타입 import"), + code: "use crate::types::MyType;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0412.html" + }] +}; diff --git a/masterror-cli/src/errors/resolution/e0425.rs b/masterror-cli/src/errors/resolution/e0425.rs new file mode 100644 index 0000000..b973d07 --- /dev/null +++ b/masterror-cli/src/errors/resolution/e0425.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0425", + title: LocalizedText::new( + "Cannot find value in this scope", + "Не удаётся найти значение в этой области видимости", + "이 스코프에서 값을 찾을 수 없음" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "You're using a variable, function, or constant that doesn't exist in scope.", + "Вы используете переменную, функцию или константу, которая не существует в текущей области.", + "스코프에 존재하지 않는 변수, 함수 또는 상수를 사용하고 있습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Declare the variable", + "Объявить переменную", + "변수 선언" + ), + code: "let x = 10;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0425.html" + }] +}; diff --git a/masterror-cli/src/errors/resolution/e0433.rs b/masterror-cli/src/errors/resolution/e0433.rs new file mode 100644 index 0000000..b9e4d19 --- /dev/null +++ b/masterror-cli/src/errors/resolution/e0433.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0433", + title: LocalizedText::new( + "Failed to resolve: use of undeclared crate or module", + "Не удалось разрешить: необъявленный крейт или модуль", + "해결 실패: 선언되지 않은 크레이트 또는 모듈" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "Rust can't find the crate, module, or type you're trying to use.", + "Rust не может найти крейт, модуль или тип.", + "Rust가 크레이트, 모듈 또는 타입을 찾을 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Add use statement", "Добавить use", "use 문 추가"), + code: "use std::collections::HashMap;" + }, + FixSuggestion { + description: LocalizedText::new( + "Add dependency", + "Добавить зависимость", + "의존성 추가" + ), + code: "[dependencies]\nserde = \"1.0\"" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0433.html" + }] +}; diff --git a/masterror-cli/src/errors/traits.rs b/masterror-cli/src/errors/traits.rs new file mode 100644 index 0000000..d402807 --- /dev/null +++ b/masterror-cli/src/errors/traits.rs @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Trait-related errors. + +mod e0038; +mod e0282; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0038::ENTRY, &e0282::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/traits/e0038.rs b/masterror-cli/src/errors/traits/e0038.rs new file mode 100644 index 0000000..9055739 --- /dev/null +++ b/masterror-cli/src/errors/traits/e0038.rs @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0038", + title: LocalizedText::new( + "Trait cannot be made into an object", + "Трейт не может быть превращён в объект", + "트레이트를 객체로 만들 수 없음" + ), + category: Category::Traits, + explanation: LocalizedText::new( + "This trait is not object-safe - it can't be used as `dyn Trait`.", + "Этот трейт не объектно-безопасен - его нельзя использовать как `dyn Trait`.", + "이 트레이트는 객체 안전하지 않습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new("Use generics", "Использовать обобщения", "제네릭 사용"), + code: "fn process(item: T) { ... }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0038.html" + }] +}; diff --git a/masterror-cli/src/errors/traits/e0282.rs b/masterror-cli/src/errors/traits/e0282.rs new file mode 100644 index 0000000..1861285 --- /dev/null +++ b/masterror-cli/src/errors/traits/e0282.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0282", + title: LocalizedText::new( + "Type annotations needed", + "Требуются аннотации типа", + "타입 어노테이션이 필요함" + ), + category: Category::Traits, + explanation: LocalizedText::new( + "The compiler cannot infer the type. Provide an explicit type annotation.", + "Компилятор не может вывести тип. Укажите явную аннотацию типа.", + "컴파일러가 타입을 추론할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add type annotation", + "Добавить аннотацию", + "타입 어노테이션 추가" + ), + code: "let numbers: Vec = input.parse().unwrap();" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0282.html" + }] +}; diff --git a/masterror-cli/src/errors/types.rs b/masterror-cli/src/errors/types.rs new file mode 100644 index 0000000..8cf39da --- /dev/null +++ b/masterror-cli/src/errors/types.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Type-related errors. + +mod e0277; +mod e0308; +mod e0599; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0277::ENTRY, &e0308::ENTRY, &e0599::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-cli/src/errors/types/e0277.rs b/masterror-cli/src/errors/types/e0277.rs new file mode 100644 index 0000000..e054ab2 --- /dev/null +++ b/masterror-cli/src/errors/types/e0277.rs @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0277", + title: LocalizedText::new( + "Trait bound not satisfied", + "Ограничение трейта не выполнено", + "트레이트 바운드가 충족되지 않음" + ), + category: Category::Types, + explanation: LocalizedText::new( + "A generic function or type requires a trait bound that your type doesn't satisfy.", + "Обобщённая функция или тип требует ограничение трейта, которому ваш тип не удовлетворяет.", + "제네릭 함수나 타입이 당신의 타입이 충족하지 않는 트레이트 바운드를 요구합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Derive the trait", + "Получить через derive", + "트레이트 derive" + ), + code: "#[derive(Hash, Eq, PartialEq)]" + }, + FixSuggestion { + description: LocalizedText::new( + "Implement manually", + "Реализовать вручную", + "수동 구현" + ), + code: "impl MyTrait for MyType { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0277.html" + }] +}; diff --git a/masterror-cli/src/errors/types/e0308.rs b/masterror-cli/src/errors/types/e0308.rs new file mode 100644 index 0000000..a01246f --- /dev/null +++ b/masterror-cli/src/errors/types/e0308.rs @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0308", + title: LocalizedText::new("Mismatched types", "Несовпадение типов", "타입 불일치"), + category: Category::Types, + explanation: LocalizedText::new( + "Rust is statically typed and does NOT perform implicit type conversions.", + "Rust статически типизирован и НЕ выполняет неявные преобразования типов.", + "Rust는 정적 타입 언어이며 암시적 타입 변환을 수행하지 않습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Use parse()", "Использовать parse()", "parse() 사용"), + code: "let n: i32 = s.parse().unwrap();" + }, + FixSuggestion { + description: LocalizedText::new("Use 'as'", "Использовать 'as'", "'as' 사용"), + code: "let n = x as i32;" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0308.html" + }] +}; diff --git a/masterror-cli/src/errors/types/e0599.rs b/masterror-cli/src/errors/types/e0599.rs new file mode 100644 index 0000000..84a2802 --- /dev/null +++ b/masterror-cli/src/errors/types/e0599.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0599", + title: LocalizedText::new( + "No method named X found for type", + "Метод не найден для типа", + "타입에서 메서드를 찾을 수 없음" + ), + category: Category::Types, + explanation: LocalizedText::new( + "You're calling a method that doesn't exist on this type. Check trait imports.", + "Вы вызываете метод, который не существует для этого типа. Проверьте импорт трейтов.", + "이 타입에 존재하지 않는 메서드를 호출하고 있습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Import the trait", + "Импортировать трейт", + "트레이트 import" + ), + code: "use std::io::Read;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0599.html" + }] +}; diff --git a/masterror-cli/src/knowledge.rs b/masterror-cli/src/knowledge.rs deleted file mode 100644 index ad184cf..0000000 --- a/masterror-cli/src/knowledge.rs +++ /dev/null @@ -1,208 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Knowledge base for Rust compiler errors. -#![allow(dead_code)] - -/// Link with title for documentation. -pub struct DocLink { - pub title: &'static str, - pub url: &'static str -} - -/// Fix suggestion with code example. -pub struct FixSuggestion { - pub description_key: &'static str, - pub code: &'static str -} - -/// Entry in the error knowledge base. -pub struct ErrorEntry { - pub code: &'static str, - pub title_key: &'static str, - pub category: &'static str, - pub explanation_key: &'static str, - pub fixes: &'static [FixSuggestion], - pub links: &'static [DocLink] -} - -/// Get all known error entries. -pub fn entries() -> &'static [ErrorEntry] { - &[ - ErrorEntry { - code: "E0382", - title_key: "e0382-title", - category: "ownership", - explanation_key: "e0382-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0382-fix-clone-desc", - code: "let s2 = s.clone();" - }, - FixSuggestion { - description_key: "e0382-fix-borrow-desc", - code: "let s2 = &s;" - }, - FixSuggestion { - description_key: "e0382-fix-copy-desc", - code: "#[derive(Copy, Clone)]" - } - ], - links: &[ - DocLink { - title: "Rust Book: Ownership", - url: "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0382.html" - }, - DocLink { - title: "Rust By Example", - url: "https://doc.rust-lang.org/rust-by-example/scope/move.html" - } - ] - }, - ErrorEntry { - code: "E0502", - title_key: "e0502-title", - category: "borrowing", - explanation_key: "e0502-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0502-fix-scope-desc", - code: "{ let r = &x; println!(\"{}\", r); } // r dropped\nx.push(1);" - }, - FixSuggestion { - description_key: "e0502-fix-clone-desc", - code: "let first = v[0].clone(); // clone before mutation" - } - ], - links: &[ - DocLink { - title: "Rust Book: References and Borrowing", - url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0502.html" - } - ] - }, - ErrorEntry { - code: "E0499", - title_key: "e0499-title", - category: "borrowing", - explanation_key: "e0499-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0499-fix-scope-desc", - code: "{ let r1 = &mut x; *r1 += 1; } // r1 dropped\nlet r2 = &mut x;" - }, - FixSuggestion { - description_key: "e0499-fix-refcell-desc", - code: "use std::cell::RefCell;\nlet x = RefCell::new(value);" - } - ], - links: &[ - DocLink { - title: "Rust Book: Mutable References", - url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0499.html" - } - ] - }, - ErrorEntry { - code: "E0308", - title_key: "e0308-title", - category: "types", - explanation_key: "e0308-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0308-fix-convert-desc", - code: "let n: i32 = s.parse().unwrap();" - }, - FixSuggestion { - description_key: "e0308-fix-as-desc", - code: "let n = x as i32;" - } - ], - links: &[ - DocLink { - title: "Rust Book: Data Types", - url: "https://doc.rust-lang.org/book/ch03-02-data-types.html" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0308.html" - } - ] - }, - ErrorEntry { - code: "E0106", - title_key: "e0106-title", - category: "lifetimes", - explanation_key: "e0106-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0106-fix-lifetime-desc", - code: "struct Foo<'a> { x: &'a str }" - }, - FixSuggestion { - description_key: "e0106-fix-owned-desc", - code: "struct Foo { x: String }" - } - ], - links: &[ - DocLink { - title: "Rust Book: Lifetimes", - url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0106.html" - } - ] - }, - ErrorEntry { - code: "E0597", - title_key: "e0597-title", - category: "lifetimes", - explanation_key: "e0597-explanation", - fixes: &[ - FixSuggestion { - description_key: "e0597-fix-move-desc", - code: "let s = String::from(\"hello\"); // move to outer scope" - }, - FixSuggestion { - description_key: "e0597-fix-owned-desc", - code: "return s.to_string(); // return owned value" - } - ], - links: &[ - DocLink { - title: "Rust Book: Lifetimes", - url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" - }, - DocLink { - title: "Rust Reference", - url: "https://doc.rust-lang.org/error_codes/E0597.html" - } - ] - } - ] -} - -/// Find error entry by code. -pub fn find(code: &str) -> Option<&'static ErrorEntry> { - let normalized = if code.starts_with('E') || code.starts_with('e') { - code.to_uppercase() - } else { - format!("E{code}") - }; - entries().iter().find(|e| e.code == normalized) -} diff --git a/masterror-cli/src/locale.rs b/masterror-cli/src/locale.rs index 9a81cf0..03d30e1 100644 --- a/masterror-cli/src/locale.rs +++ b/masterror-cli/src/locale.rs @@ -57,6 +57,11 @@ impl Locale { self.lang != "en" } + /// Get language code. + pub fn lang(&self) -> &str { + &self.lang + } + /// Translate full rendered compiler output. pub fn translate_rendered(&self, rendered: &str) -> String { if self.lang == "en" { diff --git a/masterror-cli/src/main.rs b/masterror-cli/src/main.rs index 9280306..8ff3e07 100644 --- a/masterror-cli/src/main.rs +++ b/masterror-cli/src/main.rs @@ -5,7 +5,7 @@ //! masterror CLI - Rust compiler error explainer. mod commands; -mod knowledge; +mod errors; mod locale; mod options; mod output; @@ -39,12 +39,20 @@ enum Commands { #[arg(trailing_var_arg = true)] args: Vec }, - /// Explain a specific error code + /// Explain a specific error code (E0382) or best practice (RA001) Explain { code: String }, /// List all known error codes List { #[arg(short, long)] category: Option + }, + /// Show RustManifest best practices + Practice { + /// Practice code (RA001-RA015) or empty for list + code: Option, + /// Filter by category + #[arg(short, long)] + category: Option } } @@ -61,10 +69,20 @@ fn main() { } => commands::check(&locale, args, &opts), Commands::Explain { code - } => commands::explain(&locale, code, &opts), + } => commands::explain(&cli.lang, code, &opts), Commands::List { category - } => commands::list(&locale, category.as_deref(), &opts) + } => commands::list(&cli.lang, category.as_deref(), &opts), + Commands::Practice { + code, + category + } => { + if let Some(c) = code { + commands::practice::show(&cli.lang, c, &opts) + } else { + commands::practice::list(&cli.lang, category.as_deref(), &opts) + } + } }; if let Err(e) = result { diff --git a/masterror-cli/src/output.rs b/masterror-cli/src/output.rs index aef10a4..2f1b057 100644 --- a/masterror-cli/src/output.rs +++ b/masterror-cli/src/output.rs @@ -9,8 +9,7 @@ use owo_colors::OwoColorize; #[allow(unused_imports)] use crate::sections; use crate::{ - knowledge::{self, ErrorEntry}, - locale::Locale, + errors::{ErrorEntry, ErrorRegistry}, options::DisplayOptions, parser::CargoMessage }; @@ -19,7 +18,7 @@ const SEPARATOR: &str = "--- masterror ----------------------------------------" const SEPARATOR_END: &str = "------------------------------------------------------"; /// Print error with masterror explanation. -pub fn print_error(locale: &Locale, msg: &CargoMessage, opts: &DisplayOptions) { +pub fn print_error(lang: &str, msg: &CargoMessage, opts: &DisplayOptions) { let rendered = msg.rendered_output(); #[cfg(feature = "show-original")] @@ -32,18 +31,20 @@ pub fn print_error(locale: &Locale, msg: &CargoMessage, opts: &DisplayOptions) { println!(); return; }; - let Some(entry) = knowledge::find(code) else { + + let registry = ErrorRegistry::new(); + let Some(entry) = registry.find(code) else { #[cfg(feature = "show-original")] println!(); return; }; println!(); - print_block(locale, entry, msg.error_message(), rendered, opts); + print_block(lang, entry, msg.error_message(), rendered, opts); } fn print_block( - locale: &Locale, + lang: &str, entry: &ErrorEntry, #[allow(unused_variables)] error_msg: Option<&str>, #[allow(unused_variables)] rendered: Option<&str>, @@ -56,16 +57,28 @@ fn print_block( } #[cfg(feature = "show-translation")] - sections::translation::print(locale, entry.code, rendered, opts.colored); + sections::translation::print(lang, entry.code, rendered, opts.colored); #[cfg(feature = "show-why")] - sections::why::print(locale, entry.explanation_key, opts.colored); + { + let label = match lang { + "ru" => "Почему это происходит:", + "ko" => "왜 이런 일이 발생하나요:", + _ => "Why this happens:" + }; + if opts.colored { + println!("{}", label.green().bold()); + } else { + println!("{label}"); + } + println!("{}", entry.explanation.get(lang)); + } #[cfg(feature = "show-fix")] - sections::fix::print(locale, entry.fixes, opts.colored); + sections::fix::print(lang, entry.fixes, opts.colored); #[cfg(feature = "show-link")] - sections::link::print(locale, entry.links, opts.colored); + sections::link::print(lang, entry.links, opts.colored); if opts.colored { println!("{}", SEPARATOR_END.dimmed()); diff --git a/masterror-cli/src/sections/fix.rs b/masterror-cli/src/sections/fix.rs index 143bf3c..0d6d103 100644 --- a/masterror-cli/src/sections/fix.rs +++ b/masterror-cli/src/sections/fix.rs @@ -7,15 +7,20 @@ use owo_colors::OwoColorize; -use crate::{knowledge::FixSuggestion, locale::Locale}; +use crate::errors::FixSuggestion; /// Print fix suggestions with code examples. -pub fn print(locale: &Locale, fixes: &[FixSuggestion], colored: bool) { +pub fn print(lang: &str, fixes: &[FixSuggestion], colored: bool) { if fixes.is_empty() { return; } - let label = locale.get("label-fix"); + let label = match lang { + "ru" => "Как исправить:", + "ko" => "해결 방법:", + _ => "How to fix:" + }; + if colored { println!("{}", label.green().bold()); } else { @@ -23,7 +28,7 @@ pub fn print(locale: &Locale, fixes: &[FixSuggestion], colored: bool) { } for (i, fix) in fixes.iter().enumerate() { - let desc = locale.get(fix.description_key); + let desc = fix.description.get(lang); if colored { println!(" {}. {}", (i + 1).to_string().cyan(), desc); println!(" {}", fix.code.dimmed()); diff --git a/masterror-cli/src/sections/link.rs b/masterror-cli/src/sections/link.rs index 14b4ace..dd719ea 100644 --- a/masterror-cli/src/sections/link.rs +++ b/masterror-cli/src/sections/link.rs @@ -7,15 +7,20 @@ use owo_colors::OwoColorize; -use crate::{knowledge::DocLink, locale::Locale}; +use crate::errors::DocLink; /// Print documentation links with titles. -pub fn print(locale: &Locale, links: &[DocLink], colored: bool) { +pub fn print(lang: &str, links: &[DocLink], colored: bool) { if links.is_empty() { return; } - let label = locale.get("label-link"); + let label = match lang { + "ru" => "Ссылки:", + "ko" => "링크:", + _ => "Links:" + }; + if colored { println!("{}", label.blue().bold()); } else { diff --git a/masterror-cli/src/sections/translation.rs b/masterror-cli/src/sections/translation.rs index 2cdbb7d..c131f75 100644 --- a/masterror-cli/src/sections/translation.rs +++ b/masterror-cli/src/sections/translation.rs @@ -10,8 +10,9 @@ use owo_colors::OwoColorize; use crate::locale::Locale; /// Print full translated copy of compiler error. -pub fn print(locale: &Locale, _error_code: &str, rendered: Option<&str>, colored: bool) { - if !locale.has_translation() { +pub fn print(lang: &str, _error_code: &str, rendered: Option<&str>, colored: bool) { + // Only show translation for non-English languages + if lang == "en" { return; } @@ -19,9 +20,20 @@ pub fn print(locale: &Locale, _error_code: &str, rendered: Option<&str>, colored return; }; + // Create locale to use its translation capability + let locale = Locale::new(lang); + if !locale.has_translation() { + return; + } + let translated = locale.translate_rendered(rendered); - let label = locale.get("label-translation"); + let label = match lang { + "ru" => "Перевод:", + "ko" => "번역:", + _ => "Translation:" + }; + if colored { println!("{}", label.cyan().bold()); } else { diff --git a/masterror-cli/src/sections/why.rs b/masterror-cli/src/sections/why.rs index 03e60f0..ae64595 100644 --- a/masterror-cli/src/sections/why.rs +++ b/masterror-cli/src/sections/why.rs @@ -7,12 +7,13 @@ use owo_colors::OwoColorize; -use crate::locale::Locale; - /// Print detailed explanation of the error. -pub fn print(locale: &Locale, explanation_key: &str, colored: bool) { - let label = locale.get("label-why"); - let explanation = locale.get(explanation_key); +pub fn print(lang: &str, explanation: &str, colored: bool) { + let label = match lang { + "ru" => "Почему это происходит:", + "ko" => "왜 이런 일이 발생하나요:", + _ => "Why this happens:" + }; if colored { println!("{}", label.yellow().bold()); @@ -24,8 +25,3 @@ pub fn print(locale: &Locale, explanation_key: &str, colored: bool) { println!(" {line}"); } } - -/// Print explanation with indent (for explain command). -pub fn print_indented(locale: &Locale, explanation_key: &str, colored: bool) { - print(locale, explanation_key, colored); -} From 0fbba93bbfbca0b1a6bdc8887cd8ed64977bdd50 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Fri, 23 Jan 2026 13:52:34 +0700 Subject: [PATCH 08/16] refactor: move masterror-cli to separate repository - Remove masterror-cli from workspace - Remove examples/cli-test-errors - Add link to https://github.com/RAprogramm/masterror-cli in README --- Cargo.lock | 198 ------------- Cargo.toml | 3 - README.md | 2 + README.template.md | 2 + REUSE.toml | 10 +- examples/cli-test-errors/.cargo/config.toml | 7 - examples/cli-test-errors/Cargo.lock | 15 - examples/cli-test-errors/Cargo.toml | 14 - examples/cli-test-errors/src/main.rs | 142 --------- masterror-cli/Cargo.toml | 54 ---- masterror-cli/README.md | 104 ------- masterror-cli/src/commands.rs | 14 - masterror-cli/src/commands/check.rs | 61 ---- masterror-cli/src/commands/explain.rs | 208 ------------- masterror-cli/src/commands/list.rs | 93 ------ masterror-cli/src/commands/practice.rs | 213 ------------- masterror-cli/src/errors.rs | 183 ------------ masterror-cli/src/errors/borrowing.rs | 31 -- masterror-cli/src/errors/borrowing/e0499.rs | 68 ----- masterror-cli/src/errors/borrowing/e0500.rs | 50 ---- masterror-cli/src/errors/borrowing/e0501.rs | 41 --- masterror-cli/src/errors/borrowing/e0502.rs | 63 ---- masterror-cli/src/errors/borrowing/e0503.rs | 42 --- masterror-cli/src/errors/borrowing/e0506.rs | 40 --- masterror-cli/src/errors/borrowing/e0508.rs | 50 ---- masterror-cli/src/errors/borrowing/e0596.rs | 51 ---- masterror-cli/src/errors/lifetimes.rs | 31 -- masterror-cli/src/errors/lifetimes/e0106.rs | 68 ----- masterror-cli/src/errors/lifetimes/e0495.rs | 38 --- masterror-cli/src/errors/lifetimes/e0515.rs | 51 ---- masterror-cli/src/errors/lifetimes/e0597.rs | 57 ---- masterror-cli/src/errors/lifetimes/e0621.rs | 38 --- masterror-cli/src/errors/lifetimes/e0623.rs | 37 --- masterror-cli/src/errors/lifetimes/e0700.rs | 39 --- masterror-cli/src/errors/lifetimes/e0716.rs | 40 --- masterror-cli/src/errors/ownership.rs | 29 -- masterror-cli/src/errors/ownership/e0381.rs | 55 ---- masterror-cli/src/errors/ownership/e0382.rs | 80 ----- masterror-cli/src/errors/ownership/e0383.rs | 46 --- masterror-cli/src/errors/ownership/e0384.rs | 62 ---- masterror-cli/src/errors/ownership/e0505.rs | 56 ---- masterror-cli/src/errors/ownership/e0507.rs | 71 ----- masterror-cli/src/errors/ownership/e0509.rs | 52 ---- masterror-cli/src/errors/raprogramm.rs | 150 ---------- masterror-cli/src/errors/raprogramm/ra001.rs | 39 --- masterror-cli/src/errors/raprogramm/ra002.rs | 34 --- masterror-cli/src/errors/raprogramm/ra003.rs | 39 --- masterror-cli/src/errors/raprogramm/ra004.rs | 40 --- masterror-cli/src/errors/raprogramm/ra005.rs | 48 --- masterror-cli/src/errors/raprogramm/ra006.rs | 46 --- masterror-cli/src/errors/raprogramm/ra007.rs | 44 --- masterror-cli/src/errors/raprogramm/ra008.rs | 50 ---- masterror-cli/src/errors/raprogramm/ra009.rs | 58 ---- masterror-cli/src/errors/raprogramm/ra010.rs | 56 ---- masterror-cli/src/errors/raprogramm/ra011.rs | 44 --- masterror-cli/src/errors/raprogramm/ra012.rs | 49 --- masterror-cli/src/errors/raprogramm/ra013.rs | 61 ---- masterror-cli/src/errors/raprogramm/ra014.rs | 38 --- masterror-cli/src/errors/raprogramm/ra015.rs | 43 --- masterror-cli/src/errors/resolution.rs | 17 -- masterror-cli/src/errors/resolution/e0412.rs | 28 -- masterror-cli/src/errors/resolution/e0425.rs | 32 -- masterror-cli/src/errors/resolution/e0433.rs | 38 --- masterror-cli/src/errors/traits.rs | 16 - masterror-cli/src/errors/traits/e0038.rs | 28 -- masterror-cli/src/errors/traits/e0282.rs | 32 -- masterror-cli/src/errors/types.rs | 17 -- masterror-cli/src/errors/types/e0277.rs | 42 --- masterror-cli/src/errors/types/e0308.rs | 30 -- masterror-cli/src/errors/types/e0599.rs | 32 -- masterror-cli/src/locale.rs | 83 ------ masterror-cli/src/locale/en.rs | 152 ---------- masterror-cli/src/locale/ko.rs | 241 --------------- masterror-cli/src/locale/ru.rs | 297 ------------------- masterror-cli/src/main.rs | 92 ------ masterror-cli/src/options.rs | 11 - masterror-cli/src/output.rs | 88 ------ masterror-cli/src/parser.rs | 60 ---- masterror-cli/src/sections.rs | 10 - masterror-cli/src/sections/fix.rs | 40 --- masterror-cli/src/sections/link.rs | 37 --- masterror-cli/src/sections/translation.rs | 46 --- masterror-cli/src/sections/why.rs | 27 -- 83 files changed, 5 insertions(+), 4939 deletions(-) delete mode 100644 examples/cli-test-errors/.cargo/config.toml delete mode 100644 examples/cli-test-errors/Cargo.lock delete mode 100644 examples/cli-test-errors/Cargo.toml delete mode 100644 examples/cli-test-errors/src/main.rs delete mode 100644 masterror-cli/Cargo.toml delete mode 100644 masterror-cli/README.md delete mode 100644 masterror-cli/src/commands.rs delete mode 100644 masterror-cli/src/commands/check.rs delete mode 100644 masterror-cli/src/commands/explain.rs delete mode 100644 masterror-cli/src/commands/list.rs delete mode 100644 masterror-cli/src/commands/practice.rs delete mode 100644 masterror-cli/src/errors.rs delete mode 100644 masterror-cli/src/errors/borrowing.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0499.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0500.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0501.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0502.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0503.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0506.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0508.rs delete mode 100644 masterror-cli/src/errors/borrowing/e0596.rs delete mode 100644 masterror-cli/src/errors/lifetimes.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0106.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0495.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0515.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0597.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0621.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0623.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0700.rs delete mode 100644 masterror-cli/src/errors/lifetimes/e0716.rs delete mode 100644 masterror-cli/src/errors/ownership.rs delete mode 100644 masterror-cli/src/errors/ownership/e0381.rs delete mode 100644 masterror-cli/src/errors/ownership/e0382.rs delete mode 100644 masterror-cli/src/errors/ownership/e0383.rs delete mode 100644 masterror-cli/src/errors/ownership/e0384.rs delete mode 100644 masterror-cli/src/errors/ownership/e0505.rs delete mode 100644 masterror-cli/src/errors/ownership/e0507.rs delete mode 100644 masterror-cli/src/errors/ownership/e0509.rs delete mode 100644 masterror-cli/src/errors/raprogramm.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra001.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra002.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra003.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra004.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra005.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra006.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra007.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra008.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra009.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra010.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra011.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra012.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra013.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra014.rs delete mode 100644 masterror-cli/src/errors/raprogramm/ra015.rs delete mode 100644 masterror-cli/src/errors/resolution.rs delete mode 100644 masterror-cli/src/errors/resolution/e0412.rs delete mode 100644 masterror-cli/src/errors/resolution/e0425.rs delete mode 100644 masterror-cli/src/errors/resolution/e0433.rs delete mode 100644 masterror-cli/src/errors/traits.rs delete mode 100644 masterror-cli/src/errors/traits/e0038.rs delete mode 100644 masterror-cli/src/errors/traits/e0282.rs delete mode 100644 masterror-cli/src/errors/types.rs delete mode 100644 masterror-cli/src/errors/types/e0277.rs delete mode 100644 masterror-cli/src/errors/types/e0308.rs delete mode 100644 masterror-cli/src/errors/types/e0599.rs delete mode 100644 masterror-cli/src/locale.rs delete mode 100644 masterror-cli/src/locale/en.rs delete mode 100644 masterror-cli/src/locale/ko.rs delete mode 100644 masterror-cli/src/locale/ru.rs delete mode 100644 masterror-cli/src/main.rs delete mode 100644 masterror-cli/src/options.rs delete mode 100644 masterror-cli/src/output.rs delete mode 100644 masterror-cli/src/parser.rs delete mode 100644 masterror-cli/src/sections.rs delete mode 100644 masterror-cli/src/sections/fix.rs delete mode 100644 masterror-cli/src/sections/link.rs delete mode 100644 masterror-cli/src/sections/translation.rs delete mode 100644 masterror-cli/src/sections/why.rs diff --git a/Cargo.lock b/Cargo.lock index 331f24e..a97000b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,56 +225,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - [[package]] name = "anyhow" version = "1.0.100" @@ -302,21 +258,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" -[[package]] -name = "assert_cmd" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c5bcfa8749ac45dd12cb11055aeeb6b27a3895560d60d71e3c23bf979e60514" -dependencies = [ - "anstyle", - "bstr", - "libc", - "predicates", - "predicates-core", - "predicates-tree", - "wait-timeout", -] - [[package]] name = "async-trait" version = "0.1.89" @@ -494,17 +435,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.19.1" @@ -614,7 +544,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", - "clap_derive", ] [[package]] @@ -623,23 +552,8 @@ version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ - "anstream", "anstyle", "clap_lex", - "strsim", - "terminal_size", -] - -[[package]] -name = "clap_derive" -version = "4.5.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", ] [[package]] @@ -648,12 +562,6 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - [[package]] name = "combine" version = "4.6.7" @@ -1064,12 +972,6 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - [[package]] name = "digest" version = "0.10.7" @@ -1283,15 +1185,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" -[[package]] -name = "float-cmp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" -dependencies = [ - "num-traits", -] - [[package]] name = "flume" version = "0.11.1" @@ -1945,12 +1838,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - [[package]] name = "itertools" version = "0.13.0" @@ -2118,18 +2005,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "masterror-cli" -version = "0.1.0" -dependencies = [ - "assert_cmd", - "clap", - "owo-colors", - "predicates", - "serde", - "serde_json", -] - [[package]] name = "masterror-derive" version = "0.11.2" @@ -2247,12 +2122,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2373,12 +2242,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - [[package]] name = "oorandom" version = "11.1.5" @@ -2669,36 +2532,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "predicates" -version = "3.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" -dependencies = [ - "anstyle", - "difflib", - "float-cmp", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" - -[[package]] -name = "predicates-tree" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" -dependencies = [ - "predicates-core", - "termtree", -] - [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3779,22 +3612,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "terminal_size" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" -dependencies = [ - "rustix", - "windows-sys 0.60.2", -] - -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - [[package]] name = "thiserror" version = "2.0.18" @@ -4257,12 +4074,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "utoipa" version = "5.4.0" @@ -4346,15 +4157,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index b9c6165..3b7d835 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,14 +42,11 @@ include = [ members = [ "masterror-derive", "masterror-template", - "masterror-cli", "examples/axum-rest-api", "examples/custom-domain-errors", "examples/sqlx-database", "examples/basic-async", ] -# cli-test-errors contains intentional compile errors for testing masterror-cli -exclude = ["examples/cli-test-errors"] resolver = "3" diff --git a/README.md b/README.md index bcafb01..0169777 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ SPDX-License-Identifier: MIT > 🇷🇺 [Читайте README на русском языке](README.ru.md) > 🇰🇷 [한국어 README](README.ko.md) + **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) - CLI tool for explaining Rust compiler errors + --- diff --git a/README.template.md b/README.template.md index 381a842..6f35b19 100644 --- a/README.template.md +++ b/README.template.md @@ -26,6 +26,8 @@ SPDX-License-Identifier: MIT > 🇷🇺 [Читайте README на русском языке](README.ru.md) > 🇰🇷 [한국어 README](README.ko.md) + **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) - CLI tool for explaining Rust compiler errors + --- diff --git a/REUSE.toml b/REUSE.toml index cbc61cc..ee0adcb 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -5,14 +5,6 @@ version = 1 [[annotations]] -path = [ - "**/Cargo.lock", - "pkg/aur/.SRCINFO", - "**/.cargo/config.toml", - # Files with UTF-8 non-ASCII content that reuse fails to parse - "masterror-cli/src/locale/ko.rs", - "masterror-cli/src/errors/ownership/e0382.rs", - "masterror-cli/src/errors/ownership/e0384.rs" -] +path = ["**/Cargo.lock", "pkg/aur/.SRCINFO", "**/.cargo/config.toml"] SPDX-FileCopyrightText = "2025-2026 RAprogramm " SPDX-License-Identifier = "MIT" diff --git a/examples/cli-test-errors/.cargo/config.toml b/examples/cli-test-errors/.cargo/config.toml deleted file mode 100644 index c1723c4..0000000 --- a/examples/cli-test-errors/.cargo/config.toml +++ /dev/null @@ -1,7 +0,0 @@ -# This crate contains intentional compile errors. -# Do not build it normally - use `masterror check` instead. - -[alias] -# Disable normal cargo commands - this crate should only be used with masterror -check = "echo 'Use: masterror check (this crate has intentional errors)'" -build = "echo 'Use: masterror check (this crate has intentional errors)'" diff --git a/examples/cli-test-errors/Cargo.lock b/examples/cli-test-errors/Cargo.lock deleted file mode 100644 index f872b2e..0000000 --- a/examples/cli-test-errors/Cargo.lock +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "cli-test-errors" -version = "0.1.0" - -[[patch.unused]] -name = "masterror-derive" -version = "0.11.2" - -[[patch.unused]] -name = "masterror-template" -version = "0.4.1" diff --git a/examples/cli-test-errors/Cargo.toml b/examples/cli-test-errors/Cargo.toml deleted file mode 100644 index bf95436..0000000 --- a/examples/cli-test-errors/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-FileCopyrightText: 2025-2026 RAprogramm -# -# SPDX-License-Identifier: MIT - -# This crate is EXCLUDED from workspace - it contains intentional compile errors -# for testing masterror-cli. Do not add to workspace members. - -[package] -name = "cli-test-errors" -version = "0.1.0" -edition = "2024" -publish = false - -[dependencies] diff --git a/examples/cli-test-errors/src/main.rs b/examples/cli-test-errors/src/main.rs deleted file mode 100644 index f86be25..0000000 --- a/examples/cli-test-errors/src/main.rs +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Test file with common Rust errors for masterror-cli testing. -//! -//! This file contains INTENTIONAL compile errors to test masterror-cli. -//! It should NOT be compiled directly - only used with `masterror check`. -//! -//! Run: `cd examples/cli-test-errors && cargo masterror check` -//! -//! To see all masterror features: -//! ```sh -//! # List all known errors -//! masterror list -//! -//! # List by category -//! masterror list -c ownership -//! -//! # Explain specific error -//! masterror explain E0382 -//! -//! # List best practices -//! masterror practice -//! -//! # Explain best practice -//! masterror explain RA001 -//! -//! # Use Russian language -//! masterror -l ru list -//! masterror -l ru explain E0382 -//! -//! # Use Korean language -//! masterror -l ko list -//! ``` - -fn main() { - // ==================== OWNERSHIP ERRORS ==================== - - // E0382 - Borrow of moved value - let s = String::from("hello"); - let s2 = s; - println!("{}", s); // error: value moved - - // E0381 - Borrow of possibly-uninitialized variable - let x: i32; - println!("{}", x); // error: possibly uninitialized - - // E0384 - Cannot assign twice to immutable variable - let y = 5; - y = 10; // error: immutable variable - - // E0505 - Cannot move out because it is borrowed - let mut data = String::from("data"); - let r = &data; - let moved = data; // error: borrowed - println!("{}", r); - - // E0507 - Cannot move out of borrowed content - let borrowed = &String::from("borrowed"); - let owned = *borrowed; // error: cannot move out of borrowed - - // ==================== BORROWING ERRORS ==================== - - // E0502 - Cannot borrow as mutable (already borrowed as immutable) - let mut v = vec![1, 2, 3]; - let first = &v[0]; - v.push(4); // error: mutable borrow while immutable exists - println!("{}", first); - - // E0499 - Cannot borrow as mutable more than once - let mut num = 5; - let r1 = &mut num; - let r2 = &mut num; // error: second mutable borrow - println!("{} {}", r1, r2); - - // E0596 - Cannot borrow as mutable (not declared as mutable) - let vec = vec![1, 2, 3]; - vec.push(4); // error: not mutable - - // E0503 - Cannot use value because it was mutably borrowed - let mut borrowed_mut = 10; - let r = &mut borrowed_mut; - let copy = borrowed_mut; // error: mutably borrowed - *r = 20; - - // ==================== LIFETIME ERRORS ==================== - - // E0106 - Missing lifetime specifier - struct MissingLifetime { - data: &str, // error: missing lifetime - } - - // E0597 - Value does not live long enough - let reference; - { - let short_lived = String::from("short"); - reference = &short_lived; // error: does not live long enough - } - println!("{}", reference); - - // E0515 - Cannot return reference to temporary value - fn returns_ref() -> &str { - &String::from("temp") // error: returns reference to temporary - } - - // ==================== TYPE ERRORS ==================== - - // E0308 - Mismatched types - let number: i32 = "not a number"; // error: expected i32, found &str - - // E0277 - Trait bound not satisfied - fn requires_display(t: T) {} - struct NoDisplay; - requires_display(NoDisplay); // error: Display not implemented - - // E0599 - Method not found - let val = 42; - val.nonexistent_method(); // error: method not found - - // ==================== TRAIT ERRORS ==================== - - // E0038 - Cannot be made into an object - trait NotObjectSafe { - fn generic(&self); - } - fn takes_dyn(obj: &dyn NotObjectSafe) {} // error: not object safe - - // E0282 - Type annotations needed - let needs_type = Default::default(); // error: cannot infer type - - // ==================== RESOLUTION ERRORS ==================== - - // E0412 - Cannot find type in this scope - let value: NonExistentType = todo!(); // error: type not found - - // E0425 - Cannot find value in this scope - let result = undefined_variable + 1; // error: value not found - - // E0433 - Failed to resolve: use of undeclared crate or module - use nonexistent::module; // error: module not found -} diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml deleted file mode 100644 index 072d50b..0000000 --- a/masterror-cli/Cargo.toml +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-FileCopyrightText: 2025-2026 RAprogramm -# -# SPDX-License-Identifier: MIT - -[package] -name = "masterror-cli" -version = "0.1.0" -edition.workspace = true -rust-version.workspace = true -license.workspace = true -repository.workspace = true -readme = "README.md" -description = "CLI tool for explaining Rust compiler errors in human-friendly language" -keywords = ["rust", "compiler", "errors", "explain", "learning"] -categories = ["command-line-utilities", "development-tools"] - -[[bin]] -name = "masterror" -path = "src/main.rs" - -[[bin]] -name = "cargo-masterror" -path = "src/main.rs" - -[dependencies] -# CLI framework -clap = { version = "4", features = ["derive", "env", "wrap_help"] } - -# Colored output -owo-colors = { version = "4", features = ["supports-colors"] } - -# JSON parsing (cargo output) -serde = { version = "1", features = ["derive"] } -serde_json = "1" - -[features] -default = ["show-why", "show-fix", "show-link", "show-translation"] - -# Languages (only one should be enabled, en is always available) -lang-ru = [] -lang-ko = [] - -# Display sections -show-why = [] -show-fix = [] -show-link = [] -show-translation = [] - -# Show original compiler output before masterror block -show-original = [] - -[dev-dependencies] -assert_cmd = "2" -predicates = "3" diff --git a/masterror-cli/README.md b/masterror-cli/README.md deleted file mode 100644 index 76fcde6..0000000 --- a/masterror-cli/README.md +++ /dev/null @@ -1,104 +0,0 @@ - - -# masterror-cli - -CLI tool for explaining Rust compiler errors in human-friendly language. - -## Installation - -```bash -cargo install masterror-cli -``` - -## Usage - -### Check and explain errors - -```bash -# Run cargo check with explanations -masterror check - -# Pass additional arguments to cargo -masterror check --release -masterror check -p my-crate -``` - -### Explain specific error - -```bash -# Explain an error code -masterror explain E0382 -masterror explain 0382 # E prefix is optional - -# In Russian -masterror explain E0382 --lang ru -``` - -### List known errors - -```bash -# List all known errors -masterror list - -# Filter by category -masterror list --category ownership -masterror list --category lifetimes -``` - -## Language Support - -Set language via flag or environment variable: - -```bash -# Flag -masterror check --lang ru - -# Environment variable -export MASTERROR_LANG=ru -masterror check -``` - -Supported languages: -- `en` - English (default) -- `ru` - Russian - -## Example Output - -``` -❌ E0382 - Use of moved value - - let s = String::from("hello"); - let s2 = s; // s moved to s2 - println!("{}", s); // error: s is no longer valid - - --> src/main.rs:5:10 - -📖 Why? - In Rust, each value has exactly one owner. When you assign a value - to another variable (like `let s2 = s`), ownership MOVES to the new - variable. The original variable becomes invalid. - -💡 How to fix? - • Clone the value if you need two independent copies - let s2 = s.clone(); - • Borrow with a reference if you just need to read - let s2 = &s; - -🔗 Learn more: https://doc.rust-lang.org/error_codes/E0382.html -``` - -## Contributing - -Adding new error explanations: - -1. Add `ErrorEntry` in `get_knowledge_base()` function in `src/main.rs` -2. Add translations in `Locale::english()` and `Locale::russian()` methods -3. Submit PR - -## License - -MIT diff --git a/masterror-cli/src/commands.rs b/masterror-cli/src/commands.rs deleted file mode 100644 index 225cafd..0000000 --- a/masterror-cli/src/commands.rs +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! CLI commands. - -mod check; -mod explain; -mod list; -pub mod practice; - -pub use check::run as check; -pub use explain::run as explain; -pub use list::run as list; diff --git a/masterror-cli/src/commands/check.rs b/masterror-cli/src/commands/check.rs deleted file mode 100644 index 6449643..0000000 --- a/masterror-cli/src/commands/check.rs +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Check command - run cargo check and explain errors. - -use std::{ - io::{BufRead, BufReader}, - process::{Command, Stdio} -}; - -use crate::{locale::Locale, options::DisplayOptions, output, parser::CargoMessage}; - -/// Run cargo check and explain errors. -pub fn run( - locale: &Locale, - args: &[String], - opts: &DisplayOptions -) -> Result<(), Box> { - let msg_format = if opts.colored { - "--message-format=json-diagnostic-rendered-ansi" - } else { - "--message-format=json" - }; - - let mut cmd = Command::new("cargo") - .arg("check") - .arg(msg_format) - .args(args) - .stdout(Stdio::piped()) - .stderr(Stdio::inherit()) - .spawn()?; - - let stdout = cmd.stdout.take().expect("stdout captured"); - let reader = BufReader::new(stdout); - - let mut error_count = 0; - - for line in reader.lines() { - let line = line?; - if let Ok(msg) = serde_json::from_str::(&line) - && msg.is_error() - { - error_count += 1; - output::print_error(locale.lang(), &msg, opts); - println!(); - } - } - - let status = cmd.wait()?; - - if error_count > 0 { - println!("Found {error_count} error(s). Run `masterror explain ` for details."); - } - - if !status.success() { - std::process::exit(status.code().unwrap_or(1)); - } - - Ok(()) -} diff --git a/masterror-cli/src/commands/explain.rs b/masterror-cli/src/commands/explain.rs deleted file mode 100644 index ad314ff..0000000 --- a/masterror-cli/src/commands/explain.rs +++ /dev/null @@ -1,208 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Explain command - explain a specific error code or best practice. - -use owo_colors::OwoColorize; - -use crate::{ - errors::{ - ErrorEntry, ErrorRegistry, - raprogramm::{BestPractice, PracticeRegistry} - }, - options::DisplayOptions -}; - -/// Explain a specific error code (E0382) or best practice (RA001). -pub fn run( - lang: &str, - code: &str, - opts: &DisplayOptions -) -> Result<(), Box> { - let upper = code.to_uppercase(); - - // Check if it's a best practice code (RA*) - if upper.starts_with("RA") { - let registry = PracticeRegistry::new(); - if let Some(practice) = registry.find(&upper) { - print_practice(lang, practice, opts); - return Ok(()); - } - } - - // Check if it's an error code (E*) - let registry = ErrorRegistry::new(); - if let Some(entry) = registry.find(code) { - print_error(lang, entry, opts); - return Ok(()); - } - - eprintln!("Unknown code: {code}"); - eprintln!("Run `masterror list` for error codes or `masterror practice` for best practices."); - std::process::exit(1); -} - -fn print_error(lang: &str, entry: &ErrorEntry, opts: &DisplayOptions) { - println!(); - - // Title - let title = entry.title.get(lang); - if opts.colored { - println!("{} - {}", entry.code.yellow().bold(), title.bold()); - } else { - println!("{} - {title}", entry.code); - } - - // Category - let category = entry.category.name(lang); - if opts.colored { - println!("Category: {}", category.dimmed()); - } else { - println!("Category: {category}"); - } - - // Explanation - println!(); - if opts.colored { - println!("{}", "Why this happens:".green().bold()); - } else { - println!("Why this happens:"); - } - println!("{}", entry.explanation.get(lang)); - - // Fixes - if !entry.fixes.is_empty() { - println!(); - if opts.colored { - println!("{}", "How to fix:".green().bold()); - } else { - println!("How to fix:"); - } - for (i, fix) in entry.fixes.iter().enumerate() { - println!(); - println!("{}. {}", i + 1, fix.description.get(lang)); - println!("```rust"); - println!("{}", fix.code); - println!("```"); - } - } - - // Links - if !entry.links.is_empty() { - println!(); - if opts.colored { - println!("{}", "Learn more:".cyan().bold()); - } else { - println!("Learn more:"); - } - for link in entry.links { - if opts.colored { - println!(" - {} {}", link.title, link.url.dimmed()); - } else { - println!(" - {} {}", link.title, link.url); - } - } - } - - println!(); -} - -fn print_practice(lang: &str, practice: &BestPractice, opts: &DisplayOptions) { - println!(); - - // Title - let title = practice.title.get(lang); - if opts.colored { - println!("{} - {}", practice.code.yellow().bold(), title.bold()); - } else { - println!("{} - {title}", practice.code); - } - - // Category - let category = practice.category.name(lang); - if opts.colored { - println!("Category: {}", category.dimmed()); - } else { - println!("Category: {category}"); - } - - // Explanation - println!(); - let why_label = match lang { - "ru" => "Почему это важно:", - "ko" => "왜 중요한가:", - _ => "Why this matters:" - }; - if opts.colored { - println!("{}", why_label.green().bold()); - } else { - println!("{why_label}"); - } - println!("{}", practice.explanation.get(lang)); - - // How to apply - println!(); - let how_label = match lang { - "ru" => "Как применять:", - "ko" => "적용 방법:", - _ => "How to apply:" - }; - if opts.colored { - println!("{}", how_label.green().bold()); - } else { - println!("{how_label}"); - } - - // Bad example - println!(); - let avoid_label = match lang { - "ru" => "Избегайте", - "ko" => "피하세요", - _ => "Avoid" - }; - if opts.colored { - println!("{}. {}", "1".cyan(), avoid_label.red()); - } else { - println!("1. {avoid_label}"); - } - println!("```rust"); - println!("{}", practice.bad_example); - println!("```"); - - // Good example - println!(); - let prefer_label = match lang { - "ru" => "Предпочитайте", - "ko" => "선호하세요", - _ => "Prefer" - }; - if opts.colored { - println!("{}. {}", "2".cyan(), prefer_label.green()); - } else { - println!("2. {prefer_label}"); - } - println!("```rust"); - println!("{}", practice.good_example); - println!("```"); - - // Source - println!(); - let learn_label = match lang { - "ru" => "Подробнее:", - "ko" => "더 알아보기:", - _ => "Learn more:" - }; - if opts.colored { - println!("{}", learn_label.cyan().bold()); - } else { - println!("{learn_label}"); - } - if opts.colored { - println!(" - RustManifest {}", practice.source.dimmed()); - } else { - println!(" - RustManifest {}", practice.source); - } - - println!(); -} diff --git a/masterror-cli/src/commands/list.rs b/masterror-cli/src/commands/list.rs deleted file mode 100644 index a760cec..0000000 --- a/masterror-cli/src/commands/list.rs +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! List command - list all known error codes. - -use owo_colors::OwoColorize; - -use crate::{ - errors::{Category, ErrorRegistry}, - options::DisplayOptions -}; - -/// List all known error codes. -pub fn run( - lang: &str, - category: Option<&str>, - opts: &DisplayOptions -) -> Result<(), Box> { - let registry = ErrorRegistry::new(); - - println!(); - if opts.colored { - println!("{}", "Known Rust Compiler Errors".bold()); - } else { - println!("Known Rust Compiler Errors"); - } - println!(); - - let mut entries: Vec<_> = if let Some(cat) = category { - let cat = parse_category(cat); - if let Some(c) = cat { - registry.by_category(c) - } else { - eprintln!("Unknown category: {}", category.unwrap_or("")); - eprintln!("Available: ownership, borrowing, lifetimes, types, traits, resolution"); - return Ok(()); - } - } else { - registry.all().collect() - }; - - if entries.is_empty() { - println!(" No errors found."); - return Ok(()); - } - - // Sort by code - entries.sort_by_key(|e| e.code); - - let mut current_cat: Option = None; - for entry in &entries { - if current_cat != Some(entry.category) { - current_cat = Some(entry.category); - println!(); - let cat_name = entry.category.name(lang); - if opts.colored { - println!(" {}", cat_name.yellow().bold()); - } else { - println!(" {cat_name}"); - } - println!(); - } - - let title = entry.title.get(lang); - if opts.colored { - println!(" {} - {title}", entry.code.cyan()); - } else { - println!(" {} - {title}", entry.code); - } - } - - println!(); - println!("Total: {} errors", entries.len()); - println!(); - println!("Use `masterror explain ` to see details."); - println!("Use `masterror practice` to see best practices."); - println!(); - - Ok(()) -} - -fn parse_category(s: &str) -> Option { - match s.to_lowercase().as_str() { - "ownership" | "own" => Some(Category::Ownership), - "borrowing" | "borrow" => Some(Category::Borrowing), - "lifetimes" | "lifetime" | "life" => Some(Category::Lifetimes), - "types" | "type" => Some(Category::Types), - "traits" | "trait" => Some(Category::Traits), - "resolution" | "resolve" | "names" => Some(Category::Resolution), - _ => None - } -} diff --git a/masterror-cli/src/commands/practice.rs b/masterror-cli/src/commands/practice.rs deleted file mode 100644 index b296d10..0000000 --- a/masterror-cli/src/commands/practice.rs +++ /dev/null @@ -1,213 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Practice command - show best practices from RustManifest. - -use owo_colors::OwoColorize; - -use crate::{ - errors::raprogramm::{BestPractice, PracticeCategory, PracticeRegistry}, - options::DisplayOptions -}; - -/// List all best practices or filter by category. -pub fn list( - lang: &str, - category: Option<&str>, - opts: &DisplayOptions -) -> Result<(), Box> { - let registry = PracticeRegistry::new(); - - println!(); - if opts.colored { - println!("{}", "RustManifest Best Practices".bold()); - } else { - println!("RustManifest Best Practices"); - } - println!(); - - let practices: Vec<_> = if let Some(cat) = category { - let cat = parse_category(cat); - if let Some(c) = cat { - registry.by_category(c) - } else { - eprintln!("Unknown category: {}", category.unwrap_or("")); - eprintln!( - "Available: error-handling, performance, naming, documentation, design, testing, security" - ); - return Ok(()); - } - } else { - registry.all().collect() - }; - - if practices.is_empty() { - println!(" No practices found."); - return Ok(()); - } - - let mut sorted = practices; - sorted.sort_by_key(|p| p.code); - - let mut current_cat: Option = None; - for practice in &sorted { - if current_cat != Some(practice.category) { - current_cat = Some(practice.category); - println!(); - if opts.colored { - println!(" {}", practice.category.name(lang).yellow().bold()); - } else { - println!(" {}", practice.category.name(lang)); - } - println!(); - } - - let title = practice.title.get(lang); - if opts.colored { - println!(" {} - {title}", practice.code.cyan()); - } else { - println!(" {} - {title}", practice.code); - } - } - - println!(); - println!("Total: {} practices", sorted.len()); - println!(); - println!("Use `masterror practice ` to see details."); - println!(); - - Ok(()) -} - -/// Show a specific best practice. -pub fn show( - lang: &str, - code: &str, - opts: &DisplayOptions -) -> Result<(), Box> { - let registry = PracticeRegistry::new(); - - let Some(practice) = registry.find(code) else { - eprintln!("Unknown practice code: {code}"); - eprintln!("Run `masterror practice` to see available codes."); - std::process::exit(1); - }; - - print_practice(lang, practice, opts); - Ok(()) -} - -fn print_practice(lang: &str, practice: &BestPractice, opts: &DisplayOptions) { - println!(); - - // Title - let title = practice.title.get(lang); - if opts.colored { - println!("{} - {}", practice.code.yellow().bold(), title.bold()); - } else { - println!("{} - {title}", practice.code); - } - - // Category - let category = practice.category.name(lang); - if opts.colored { - println!("Category: {}", category.dimmed()); - } else { - println!("Category: {category}"); - } - - // Explanation - println!(); - let why_label = match lang { - "ru" => "Почему это важно:", - "ko" => "왜 중요한가:", - _ => "Why this matters:" - }; - if opts.colored { - println!("{}", why_label.green().bold()); - } else { - println!("{why_label}"); - } - println!("{}", practice.explanation.get(lang)); - - // How to apply - println!(); - let how_label = match lang { - "ru" => "Как применять:", - "ko" => "적용 방법:", - _ => "How to apply:" - }; - if opts.colored { - println!("{}", how_label.green().bold()); - } else { - println!("{how_label}"); - } - - // Bad example - println!(); - let avoid_label = match lang { - "ru" => "Избегайте", - "ko" => "피하세요", - _ => "Avoid" - }; - if opts.colored { - println!("{}. {}", "1".cyan(), avoid_label.red()); - } else { - println!("1. {avoid_label}"); - } - println!("```rust"); - println!("{}", practice.bad_example); - println!("```"); - - // Good example - println!(); - let prefer_label = match lang { - "ru" => "Предпочитайте", - "ko" => "선호하세요", - _ => "Prefer" - }; - if opts.colored { - println!("{}. {}", "2".cyan(), prefer_label.green()); - } else { - println!("2. {prefer_label}"); - } - println!("```rust"); - println!("{}", practice.good_example); - println!("```"); - - // Source - println!(); - let learn_label = match lang { - "ru" => "Подробнее:", - "ko" => "더 알아보기:", - _ => "Learn more:" - }; - if opts.colored { - println!("{}", learn_label.cyan().bold()); - } else { - println!("{learn_label}"); - } - if opts.colored { - println!(" - RustManifest {}", practice.source.dimmed()); - } else { - println!(" - RustManifest {}", practice.source); - } - - println!(); -} - -fn parse_category(s: &str) -> Option { - match s.to_lowercase().as_str() { - "error-handling" | "error_handling" | "errorhandling" | "errors" => { - Some(PracticeCategory::ErrorHandling) - } - "performance" | "perf" => Some(PracticeCategory::Performance), - "naming" | "names" => Some(PracticeCategory::Naming), - "documentation" | "docs" | "doc" => Some(PracticeCategory::Documentation), - "design" | "architecture" | "arch" => Some(PracticeCategory::Design), - "testing" | "tests" | "test" => Some(PracticeCategory::Testing), - "security" | "sec" => Some(PracticeCategory::Security), - _ => None - } -} diff --git a/masterror-cli/src/errors.rs b/masterror-cli/src/errors.rs deleted file mode 100644 index 406a20b..0000000 --- a/masterror-cli/src/errors.rs +++ /dev/null @@ -1,183 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Rust compiler error explanations organized by category. - -pub mod borrowing; -pub mod lifetimes; -pub mod ownership; -pub mod raprogramm; -pub mod resolution; -pub mod traits; -pub mod types; - -use std::collections::HashMap; - -/// Link with title for documentation. -#[derive(Debug, Clone)] -pub struct DocLink { - pub title: &'static str, - pub url: &'static str -} - -/// Fix suggestion with code example. -#[derive(Debug, Clone)] -pub struct FixSuggestion { - pub description: LocalizedText, - pub code: &'static str -} - -/// Localized text with translations. -#[derive(Debug, Clone)] -pub struct LocalizedText { - pub en: &'static str, - pub ru: &'static str, - pub ko: &'static str -} - -impl LocalizedText { - pub const fn new(en: &'static str, ru: &'static str, ko: &'static str) -> Self { - Self { - en, - ru, - ko - } - } - - pub fn get(&self, lang: &str) -> &'static str { - match lang { - "ru" => self.ru, - "ko" => self.ko, - _ => self.en - } - } -} - -/// Error category. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum Category { - Ownership, - Borrowing, - Lifetimes, - Types, - Traits, - Resolution -} - -impl Category { - pub fn name(&self, lang: &str) -> &'static str { - match (self, lang) { - (Self::Ownership, "ru") => "Владение", - (Self::Ownership, "ko") => "소유권", - (Self::Ownership, _) => "Ownership", - - (Self::Borrowing, "ru") => "Заимствование", - (Self::Borrowing, "ko") => "빌림", - (Self::Borrowing, _) => "Borrowing", - - (Self::Lifetimes, "ru") => "Времена жизни", - (Self::Lifetimes, "ko") => "라이프타임", - (Self::Lifetimes, _) => "Lifetimes", - - (Self::Types, "ru") => "Типы", - (Self::Types, "ko") => "타입", - (Self::Types, _) => "Types", - - (Self::Traits, "ru") => "Трейты", - (Self::Traits, "ko") => "트레이트", - (Self::Traits, _) => "Traits", - - (Self::Resolution, "ru") => "Разрешение имён", - (Self::Resolution, "ko") => "이름 확인", - (Self::Resolution, _) => "Name Resolution" - } - } -} - -/// Complete error entry. -#[derive(Debug, Clone)] -pub struct ErrorEntry { - pub code: &'static str, - pub title: LocalizedText, - pub category: Category, - pub explanation: LocalizedText, - pub fixes: &'static [FixSuggestion], - pub links: &'static [DocLink] -} - -/// Registry of all known errors. -pub struct ErrorRegistry { - errors: HashMap<&'static str, &'static ErrorEntry> -} - -impl ErrorRegistry { - /// Build registry from all modules. - pub fn new() -> Self { - let mut errors = HashMap::new(); - - // Ownership errors - for entry in ownership::entries() { - errors.insert(entry.code, *entry); - } - - // Borrowing errors - for entry in borrowing::entries() { - errors.insert(entry.code, *entry); - } - - // Lifetime errors - for entry in lifetimes::entries() { - errors.insert(entry.code, *entry); - } - - // Type errors - for entry in types::entries() { - errors.insert(entry.code, *entry); - } - - // Trait errors - for entry in traits::entries() { - errors.insert(entry.code, *entry); - } - - // Resolution errors - for entry in resolution::entries() { - errors.insert(entry.code, *entry); - } - - Self { - errors - } - } - - /// Find error by code. - pub fn find(&self, code: &str) -> Option<&'static ErrorEntry> { - let normalized = if code.starts_with('E') || code.starts_with('e') { - code.to_uppercase() - } else { - format!("E{code}") - }; - self.errors.get(normalized.as_str()).copied() - } - - /// Get all errors. - pub fn all(&self) -> impl Iterator + '_ { - self.errors.values().copied() - } - - /// Get errors by category. - pub fn by_category(&self, cat: Category) -> Vec<&'static ErrorEntry> { - self.errors - .values() - .filter(|e| e.category == cat) - .copied() - .collect() - } -} - -impl Default for ErrorRegistry { - fn default() -> Self { - Self::new() - } -} diff --git a/masterror-cli/src/errors/borrowing.rs b/masterror-cli/src/errors/borrowing.rs deleted file mode 100644 index d857c8b..0000000 --- a/masterror-cli/src/errors/borrowing.rs +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Borrowing-related errors. - -mod e0499; -mod e0500; -mod e0501; -mod e0502; -mod e0503; -mod e0506; -mod e0508; -mod e0596; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[ - &e0499::ENTRY, - &e0500::ENTRY, - &e0501::ENTRY, - &e0502::ENTRY, - &e0503::ENTRY, - &e0506::ENTRY, - &e0508::ENTRY, - &e0596::ENTRY -]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/borrowing/e0499.rs b/masterror-cli/src/errors/borrowing/e0499.rs deleted file mode 100644 index b43ca0b..0000000 --- a/masterror-cli/src/errors/borrowing/e0499.rs +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0499: cannot borrow as mutable more than once - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0499", - title: LocalizedText::new( - "Cannot borrow as mutable more than once", - "Нельзя заимствовать как изменяемое более одного раза", - "가변으로 두 번 이상 빌릴 수 없음" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -Rust allows only ONE mutable reference to data at a time. This is stricter -than the immutable borrowing rule and prevents all aliased mutation. - -Why? Two mutable references to the same data could lead to: -- Data races in concurrent code -- Iterator invalidation -- Dangling pointers after reallocation - -This rule is checked at compile time, giving you fearless concurrency.", - "\ -Rust разрешает только ОДНУ изменяемую ссылку на данные одновременно. -Это строже правила неизменяемого заимствования. - -Почему? Две изменяемые ссылки на одни данные могут привести к: -- Гонкам данных в конкурентном коде -- Инвалидации итераторов -- Висячим указателям после реаллокации", - "\ -Rust는 데이터에 대해 한 번에 하나의 가변 참조만 허용합니다. -이는 불변 빌림 규칙보다 엄격합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Use scopes to limit borrow lifetime", - "Использовать области видимости", - "스코프를 사용하여 빌림 수명 제한" - ), - code: "{ let r1 = &mut x; *r1 += 1; } // r1 dropped\nlet r2 = &mut x;" - }, - FixSuggestion { - description: LocalizedText::new( - "Use RefCell for interior mutability", - "Использовать RefCell", - "내부 가변성을 위해 RefCell 사용" - ), - code: "use std::cell::RefCell;\nlet x = RefCell::new(value);" - } - ], - links: &[ - DocLink { - title: "Rust Book: Mutable References", - url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0499.html" - } - ] -}; diff --git a/masterror-cli/src/errors/borrowing/e0500.rs b/masterror-cli/src/errors/borrowing/e0500.rs deleted file mode 100644 index 8721f48..0000000 --- a/masterror-cli/src/errors/borrowing/e0500.rs +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0500: closure requires unique access but X is already borrowed - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0500", - title: LocalizedText::new( - "Closure requires unique access but value is already borrowed", - "Замыкание требует уникальный доступ, но значение уже заимствовано", - "클로저가 고유 접근을 필요로 하지만 값이 이미 빌려짐" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -A closure that mutates a captured variable needs exclusive access to it. -But you've already borrowed the value elsewhere, creating a conflict. - -Closures that capture by mutable reference act like mutable borrows.", - "\ -Замыкание, изменяющее захваченную переменную, требует эксклюзивного доступа.", - "\ -캡처된 변수를 변경하는 클로저는 독점적인 접근이 필요합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "End the borrow before the closure", - "Завершить заимствование перед замыканием", - "클로저 전에 빌림 종료" - ), - code: "{ let r = &x; use(r); }\nlet c = || x += 1;" - }, - FixSuggestion { - description: LocalizedText::new( - "Move the value into the closure", - "Переместить значение в замыкание", - "클로저로 값 이동" - ), - code: "let c = move || { x += 1; };" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0500.html" - }] -}; diff --git a/masterror-cli/src/errors/borrowing/e0501.rs b/masterror-cli/src/errors/borrowing/e0501.rs deleted file mode 100644 index 34298ab..0000000 --- a/masterror-cli/src/errors/borrowing/e0501.rs +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0501: cannot borrow X as mutable because previous closure requires unique -//! access - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0501", - title: LocalizedText::new( - "Cannot borrow because closure requires unique access", - "Нельзя заимствовать, так как замыкание требует уникальный доступ", - "클로저가 고유 접근을 필요로 하여 빌릴 수 없음" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -A closure has captured a variable mutably, and now you're trying to borrow -that same variable again. The closure's capture acts like a mutable borrow -that lasts for the closure's entire lifetime.", - "\ -Замыкание захватило переменную изменяемо, и теперь вы пытаетесь заимствовать -ту же переменную снова.", - "\ -클로저가 변수를 가변으로 캡처했고, 이제 같은 변수를 다시 빌리려고 합니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Use the closure before borrowing again", - "Использовать замыкание перед повторным заимствованием", - "다시 빌리기 전에 클로저 사용" - ), - code: "let mut c = || x += 1;\nc(); // use closure\nlet r = &x; // now safe" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0501.html" - }] -}; diff --git a/masterror-cli/src/errors/borrowing/e0502.rs b/masterror-cli/src/errors/borrowing/e0502.rs deleted file mode 100644 index fa372c0..0000000 --- a/masterror-cli/src/errors/borrowing/e0502.rs +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0502: cannot borrow as mutable because also borrowed as immutable - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0502", - title: LocalizedText::new( - "Cannot borrow as mutable (already borrowed as immutable)", - "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)", - "가변으로 빌릴 수 없음 (이미 불변으로 빌림)" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -Rust enforces a strict borrowing rule: you can have EITHER one mutable -reference OR any number of immutable references, but never both at once. - -This prevents data races at compile time. If you could mutate data while -someone else is reading it, the reader might see inconsistent state. - -The immutable borrow is still \"active\" because it's used later in code.", - "\ -Rust применяет строгое правило: можно иметь ЛИБО одну изменяемую ссылку, -ЛИБО любое количество неизменяемых, но никогда обе одновременно. - -Это предотвращает гонки данных.", - "\ -Rust는 엄격한 빌림 규칙을 적용합니다: 하나의 가변 참조 또는 여러 불변 참조를 -가질 수 있지만, 동시에 둘 다 가질 수는 없습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "End the immutable borrow before mutating", - "Завершить неизменяемое заимствование", - "변경 전에 불변 빌림 종료" - ), - code: "{ let r = &x; println!(\"{}\", r); } // r dropped\nx.push(1);" - }, - FixSuggestion { - description: LocalizedText::new( - "Clone before mutation", - "Клонировать перед изменением", - "변경 전에 복제" - ), - code: "let copy = x[0].clone();\nx.push(copy);" - } - ], - links: &[ - DocLink { - title: "Rust Book: References and Borrowing", - url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0502.html" - } - ] -}; diff --git a/masterror-cli/src/errors/borrowing/e0503.rs b/masterror-cli/src/errors/borrowing/e0503.rs deleted file mode 100644 index 083a5c3..0000000 --- a/masterror-cli/src/errors/borrowing/e0503.rs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0503: cannot use X because it was mutably borrowed - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0503", - title: LocalizedText::new( - "Cannot use value because it was mutably borrowed", - "Нельзя использовать значение, так как оно изменяемо заимствовано", - "가변으로 빌려져서 값을 사용할 수 없음" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -While a mutable borrow is active, you cannot access the original value -in any way. This prevents you from observing partially modified state -or creating aliased mutable references. - -The mutable borrow has exclusive access until it ends.", - "\ -Пока активно изменяемое заимствование, вы не можете обращаться к -исходному значению никак.", - "\ -가변 빌림이 활성화된 동안 원래 값에 어떤 방식으로도 접근할 수 없습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "End the mutable borrow first", - "Сначала завершить изменяемое заимствование", - "먼저 가변 빌림 종료" - ), - code: "{ let r = &mut x; modify(r); } // r dropped\nuse_value(&x);" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0503.html" - }] -}; diff --git a/masterror-cli/src/errors/borrowing/e0506.rs b/masterror-cli/src/errors/borrowing/e0506.rs deleted file mode 100644 index 8c3a482..0000000 --- a/masterror-cli/src/errors/borrowing/e0506.rs +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0506: cannot assign to X because it is borrowed - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0506", - title: LocalizedText::new( - "Cannot assign because it is borrowed", - "Нельзя присвоить, так как значение заимствовано", - "빌려져 있어서 할당할 수 없음" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -You're trying to assign to a value while a borrow of it exists. -This would invalidate the existing reference. - -You must wait for all borrows to end before assigning a new value.", - "\ -Вы пытаетесь присвоить значение, пока существует его заимствование.", - "\ -빌림이 존재하는 동안 값에 할당하려고 합니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "End the borrow before assigning", - "Завершить заимствование перед присваиванием", - "할당 전에 빌림 종료" - ), - code: "{ let r = &x; use(r); } // borrow ends\nx = new_value;" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0506.html" - }] -}; diff --git a/masterror-cli/src/errors/borrowing/e0508.rs b/masterror-cli/src/errors/borrowing/e0508.rs deleted file mode 100644 index 8782534..0000000 --- a/masterror-cli/src/errors/borrowing/e0508.rs +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0508: cannot move out of type [T], a non-copy slice - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0508", - title: LocalizedText::new( - "Cannot move out of type, a non-copy slice", - "Нельзя переместить из типа — это не-Copy срез", - "타입에서 이동할 수 없음, 비복사 슬라이스" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -You're trying to move a value out of a slice, but slices don't own their data. -They're just views into an array or Vec. - -Moving out would leave a \"hole\" in the slice, which isn't allowed.", - "\ -Вы пытаетесь переместить значение из среза, но срезы не владеют данными.", - "\ -슬라이스에서 값을 이동하려고 하지만, 슬라이스는 데이터를 소유하지 않습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Clone the element", - "Клонировать элемент", - "요소 복제" - ), - code: "let elem = slice[i].clone();" - }, - FixSuggestion { - description: LocalizedText::new( - "Use into_iter() on Vec", - "Использовать into_iter() на Vec", - "Vec에 into_iter() 사용" - ), - code: "for elem in vec.into_iter() { ... }" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0508.html" - }] -}; diff --git a/masterror-cli/src/errors/borrowing/e0596.rs b/masterror-cli/src/errors/borrowing/e0596.rs deleted file mode 100644 index 3f17af3..0000000 --- a/masterror-cli/src/errors/borrowing/e0596.rs +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0596: cannot borrow as mutable, as it is not declared as mutable - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0596", - title: LocalizedText::new( - "Cannot borrow as mutable (not declared as mutable)", - "Нельзя заимствовать как изменяемое (не объявлено как изменяемое)", - "가변으로 빌릴 수 없음 (가변으로 선언되지 않음)" - ), - category: Category::Borrowing, - explanation: LocalizedText::new( - "\ -You're trying to get a mutable reference to something that wasn't declared -as mutable. To modify through a reference, the original binding must be `mut`. - -This is Rust's way of making mutation explicit and visible in the code.", - "\ -Вы пытаетесь получить изменяемую ссылку на то, что не было объявлено -как изменяемое. Для изменения через ссылку оригинал должен быть `mut`.", - "\ -가변으로 선언되지 않은 것에 대한 가변 참조를 얻으려고 합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Add mut to the variable declaration", - "Добавить mut к объявлению переменной", - "변수 선언에 mut 추가" - ), - code: "let mut x = vec![1, 2, 3];" - }, - FixSuggestion { - description: LocalizedText::new( - "Add mut to function parameter", - "Добавить mut к параметру функции", - "함수 매개변수에 mut 추가" - ), - code: "fn process(data: &mut Vec) { ... }" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0596.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes.rs b/masterror-cli/src/errors/lifetimes.rs deleted file mode 100644 index 8132ece..0000000 --- a/masterror-cli/src/errors/lifetimes.rs +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Lifetime-related errors. - -mod e0106; -mod e0495; -mod e0515; -mod e0597; -mod e0621; -mod e0623; -mod e0700; -mod e0716; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[ - &e0106::ENTRY, - &e0495::ENTRY, - &e0515::ENTRY, - &e0597::ENTRY, - &e0621::ENTRY, - &e0623::ENTRY, - &e0700::ENTRY, - &e0716::ENTRY -]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/lifetimes/e0106.rs b/masterror-cli/src/errors/lifetimes/e0106.rs deleted file mode 100644 index 3d10310..0000000 --- a/masterror-cli/src/errors/lifetimes/e0106.rs +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0106: missing lifetime specifier - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0106", - title: LocalizedText::new( - "Missing lifetime specifier", - "Отсутствует спецификатор времени жизни", - "라이프타임 지정자 누락" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -References in Rust have lifetimes - they describe how long the reference -is valid. Usually the compiler infers lifetimes, but sometimes you must -be explicit. - -Lifetime annotations don't change how long values live. They describe -relationships between references so the compiler can verify safety.", - "\ -Ссылки в Rust имеют времена жизни — они описывают, как долго ссылка -действительна. Обычно компилятор выводит времена жизни, но иногда нужно -указать явно.", - "\ -Rust의 참조에는 라이프타임이 있습니다 - 참조가 얼마나 오래 유효한지 설명합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Add explicit lifetime parameter", - "Добавить явный параметр времени жизни", - "명시적 라이프타임 매개변수 추가" - ), - code: "struct Foo<'a> { x: &'a str }" - }, - FixSuggestion { - description: LocalizedText::new( - "Use owned type instead", - "Использовать владеющий тип", - "소유 타입 사용" - ), - code: "struct Foo { x: String }" - }, - FixSuggestion { - description: LocalizedText::new( - "Use 'static for compile-time constants", - "Использовать 'static для констант", - "컴파일 시간 상수에 'static 사용" - ), - code: "fn get_str() -> &'static str { \"hello\" }" - } - ], - links: &[ - DocLink { - title: "Rust Book: Lifetimes", - url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0106.html" - } - ] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0495.rs b/masterror-cli/src/errors/lifetimes/e0495.rs deleted file mode 100644 index a5ce0a0..0000000 --- a/masterror-cli/src/errors/lifetimes/e0495.rs +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0495: cannot infer an appropriate lifetime - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0495", - title: LocalizedText::new( - "Cannot infer an appropriate lifetime", - "Невозможно вывести подходящее время жизни", - "적절한 라이프타임을 추론할 수 없음" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -The compiler found conflicting lifetime requirements and couldn't -determine which one to use.", - "\ -Компилятор обнаружил конфликтующие требования времён жизни.", - "\ -컴파일러가 충돌하는 라이프타임 요구사항을 찾았습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Add explicit lifetime bounds", - "Добавить явные ограничения времени жизни", - "명시적 라이프타임 바운드 추가" - ), - code: "fn process<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0495.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0515.rs b/masterror-cli/src/errors/lifetimes/e0515.rs deleted file mode 100644 index f8ca6a2..0000000 --- a/masterror-cli/src/errors/lifetimes/e0515.rs +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0515: cannot return reference to temporary value - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0515", - title: LocalizedText::new( - "Cannot return reference to temporary value", - "Нельзя вернуть ссылку на временное значение", - "임시 값에 대한 참조를 반환할 수 없음" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -You're trying to return a reference to a value that was created inside -the function. When the function returns, that value is dropped. - -The reference would point to freed memory - a dangling pointer.", - "\ -Вы пытаетесь вернуть ссылку на значение, созданное внутри функции. -При возврате из функции это значение будет уничтожено.", - "\ -함수 내에서 생성된 값에 대한 참조를 반환하려고 합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Return owned value instead of reference", - "Вернуть владеющее значение вместо ссылки", - "참조 대신 소유 값 반환" - ), - code: "fn create() -> String { String::from(\"hello\") }" - }, - FixSuggestion { - description: LocalizedText::new( - "Use a parameter lifetime", - "Использовать время жизни параметра", - "매개변수 라이프타임 사용" - ), - code: "fn longest<'a>(x: &'a str, y: &'a str) -> &'a str" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0515.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0597.rs b/masterror-cli/src/errors/lifetimes/e0597.rs deleted file mode 100644 index bf3f11f..0000000 --- a/masterror-cli/src/errors/lifetimes/e0597.rs +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0597: value does not live long enough - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0597", - title: LocalizedText::new( - "Value does not live long enough", - "Значение живёт недостаточно долго", - "값이 충분히 오래 살지 않음" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -You're creating a reference to something that will be destroyed before -the reference is used. This would create a dangling pointer. - -Rust prevents this at compile time. The referenced value must live at -least as long as the reference itself.", - "\ -Вы создаёте ссылку на что-то, что будет уничтожено до использования ссылки.", - "\ -참조가 사용되기 전에 파괴될 것에 대한 참조를 만들고 있습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Move value to outer scope", - "Переместить значение во внешнюю область", - "값을 외부 스코프로 이동" - ), - code: "let s = String::from(\"hello\"); // declare before use" - }, - FixSuggestion { - description: LocalizedText::new( - "Return owned value instead", - "Вернуть владеющее значение", - "소유 값 반환" - ), - code: "fn get() -> String { s.to_string() }" - } - ], - links: &[ - DocLink { - title: "Rust Book: Lifetimes", - url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0597.html" - } - ] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0621.rs b/masterror-cli/src/errors/lifetimes/e0621.rs deleted file mode 100644 index b7247fc..0000000 --- a/masterror-cli/src/errors/lifetimes/e0621.rs +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0621: explicit lifetime required in the type of X - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0621", - title: LocalizedText::new( - "Explicit lifetime required in the type", - "Требуется явное время жизни в типе", - "타입에 명시적 라이프타임이 필요함" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -The compiler cannot infer lifetimes in this context. You need to add -explicit lifetime annotations to show how references relate.", - "\ -Компилятор не может вывести времена жизни в этом контексте.", - "\ -컴파일러가 이 컨텍스트에서 라이프타임을 추론할 수 없습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Add lifetime parameter to function", - "Добавить параметр времени жизни к функции", - "함수에 라이프타임 매개변수 추가" - ), - code: "fn process<'a>(data: &'a str) -> &'a str { data }" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0621.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0623.rs b/masterror-cli/src/errors/lifetimes/e0623.rs deleted file mode 100644 index 152bb3b..0000000 --- a/masterror-cli/src/errors/lifetimes/e0623.rs +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0623: lifetime mismatch - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0623", - title: LocalizedText::new( - "Lifetime mismatch", - "Несоответствие времён жизни", - "라이프타임 불일치" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -Two lifetimes in your code don't match where they should.", - "\ -Два времени жизни в коде не совпадают там, где должны.", - "\ -코드에서 두 라이프타임이 일치해야 하는 곳에서 일치하지 않습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Ensure consistent lifetime annotations", - "Обеспечить согласованные аннотации", - "일관된 라이프타임 어노테이션 확보" - ), - code: "fn foo<'a>(x: &'a str) -> &'a str { x }" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0623.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0700.rs b/masterror-cli/src/errors/lifetimes/e0700.rs deleted file mode 100644 index f0ec8d0..0000000 --- a/masterror-cli/src/errors/lifetimes/e0700.rs +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0700: hidden type captures lifetime - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0700", - title: LocalizedText::new( - "Hidden type captures lifetime", - "Скрытый тип захватывает время жизни", - "숨겨진 타입이 라이프타임을 캡처함" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -When using `impl Trait` return type, the hidden concrete type captures -a lifetime that isn't declared in the function signature.", - "\ -При использовании типа возврата `impl Trait` скрытый конкретный тип -захватывает время жизни, не объявленное в сигнатуре.", - "\ -`impl Trait` 반환 타입을 사용할 때, 숨겨진 구체적 타입이 선언되지 않은 라이프타임을 캡처합니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Declare the captured lifetime", - "Объявить захваченное время жизни", - "캡처된 라이프타임 선언" - ), - code: "fn foo<'a>(x: &'a str) -> impl Iterator + 'a" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0700.html" - }] -}; diff --git a/masterror-cli/src/errors/lifetimes/e0716.rs b/masterror-cli/src/errors/lifetimes/e0716.rs deleted file mode 100644 index f12a054..0000000 --- a/masterror-cli/src/errors/lifetimes/e0716.rs +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0716: temporary value dropped while borrowed - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0716", - title: LocalizedText::new( - "Temporary value dropped while borrowed", - "Временное значение уничтожено во время заимствования", - "빌린 동안 임시 값이 삭제됨" - ), - category: Category::Lifetimes, - explanation: LocalizedText::new( - "\ -A temporary value was created, borrowed, and then immediately dropped. -The borrow outlives the temporary. - -Temporaries only live until the end of the statement by default.", - "\ -Было создано временное значение, заимствовано и сразу уничтожено.", - "\ -임시 값이 생성되고, 빌려지고, 즉시 삭제되었습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Bind temporary to a variable", - "Привязать временное значение к переменной", - "임시 값을 변수에 바인딩" - ), - code: "let value = create_value();\nlet reference = &value;" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0716.html" - }] -}; diff --git a/masterror-cli/src/errors/ownership.rs b/masterror-cli/src/errors/ownership.rs deleted file mode 100644 index 516a81b..0000000 --- a/masterror-cli/src/errors/ownership.rs +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Ownership-related errors. - -mod e0381; -mod e0382; -mod e0383; -mod e0384; -mod e0505; -mod e0507; -mod e0509; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[ - &e0381::ENTRY, - &e0382::ENTRY, - &e0383::ENTRY, - &e0384::ENTRY, - &e0505::ENTRY, - &e0507::ENTRY, - &e0509::ENTRY -]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/ownership/e0381.rs b/masterror-cli/src/errors/ownership/e0381.rs deleted file mode 100644 index 8518c29..0000000 --- a/masterror-cli/src/errors/ownership/e0381.rs +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0381: borrow of possibly-uninitialized variable - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0381", - title: LocalizedText::new( - "Borrow of possibly-uninitialized variable", - "Заимствование возможно неинициализированной переменной", - "초기화되지 않았을 수 있는 변수의 빌림" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -Rust requires all variables to be initialized before use. You're trying -to use a variable that might not have been assigned a value yet. - -This prevents reading garbage memory. The compiler tracks initialization -through all possible code paths.", - "\ -Rust требует инициализации всех переменных перед использованием. -Вы пытаетесь использовать переменную, которая может быть не инициализирована. - -Это предотвращает чтение мусора из памяти.", - "\ -Rust는 사용 전에 모든 변수를 초기화해야 합니다. -아직 값이 할당되지 않았을 수 있는 변수를 사용하려고 합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Initialize the variable", - "Инициализировать переменную", - "변수 초기화" - ), - code: "let x = 0; // or any default value" - }, - FixSuggestion { - description: LocalizedText::new( - "Use Option for maybe-uninitialized", - "Использовать Option для возможно неинициализированных", - "초기화되지 않을 수 있는 경우 Option 사용" - ), - code: "let x: Option = None;\nif condition { x = Some(42); }" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0381.html" - }] -}; diff --git a/masterror-cli/src/errors/ownership/e0382.rs b/masterror-cli/src/errors/ownership/e0382.rs deleted file mode 100644 index f5371d6..0000000 --- a/masterror-cli/src/errors/ownership/e0382.rs +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0382: borrow of moved value - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0382", - title: LocalizedText::new( - "Borrow of moved value", - "Заимствование перемещённого значения", - "이동된 값의 빌림" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -In Rust, each value has exactly one owner at a time. This is the foundation -of Rust's memory safety guarantees without garbage collection. - -When you assign a value to another variable or pass it to a function, -ownership MOVES to the new location. The original variable becomes invalid -and cannot be used anymore. - -This happens because Rust needs to know exactly when to free memory. -With one owner, there's no ambiguity about who is responsible for cleanup.", - "\ -В Rust каждое значение имеет ровно одного владельца. Это основа -гарантий безопасности памяти без сборщика мусора. - -Когда вы присваиваете значение другой переменной или передаёте в функцию, -владение ПЕРЕМЕЩАЕТСЯ. Исходная переменная становится недействительной. - -Rust должен точно знать, когда освобождать память. -С одним владельцем нет неоднозначности в том, кто отвечает за очистку.", - "\ -Rust에서 각 값은 정확히 하나의 소유자를 가집니다. 이것이 가비지 컬렉터 없이 -메모리 안전성을 보장하는 기반입니다. - -값을 다른 변수에 할당하거나 함수에 전달하면 소유권이 새 위치로 이동합니다. -원래 변수는 무효화되어 더 이상 사용할 수 없습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Clone the value (creates a deep copy)", - "Клонировать значение (глубокая копия)", - "값을 복제 (깊은 복사)" - ), - code: "let s2 = s.clone();" - }, - FixSuggestion { - description: LocalizedText::new( - "Borrow with a reference (no copy)", - "Заимствовать по ссылке (без копии)", - "참조로 빌림 (복사 없음)" - ), - code: "let s2 = &s;" - }, - FixSuggestion { - description: LocalizedText::new( - "Implement Copy trait (for small types)", - "Реализовать Copy (для маленьких типов)", - "Copy 트레이트 구현 (작은 타입용)" - ), - code: "#[derive(Copy, Clone)]" - } - ], - links: &[ - DocLink { - title: "Rust Book: Ownership", - url: "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0382.html" - } - ] -}; diff --git a/masterror-cli/src/errors/ownership/e0383.rs b/masterror-cli/src/errors/ownership/e0383.rs deleted file mode 100644 index ebf37f9..0000000 --- a/masterror-cli/src/errors/ownership/e0383.rs +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0383: partial reinitialization of uninitialized structure - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0383", - title: LocalizedText::new( - "Partial reinitialization of uninitialized structure", - "Частичная переинициализация неинициализированной структуры", - "초기화되지 않은 구조체의 부분 재초기화" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -You're trying to partially reinitialize a struct that was moved from. -After a move, the entire struct is invalid - you can't assign to just -one field. - -You must reinitialize the entire struct.", - "\ -Вы пытаетесь частично переинициализировать структуру после перемещения. -После перемещения вся структура недействительна - нельзя присвоить -только одно поле. - -Нужно переинициализировать всю структуру.", - "\ -이동된 구조체를 부분적으로 재초기화하려고 합니다. -이동 후 전체 구조체가 무효화됩니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Reinitialize the entire struct", - "Переинициализировать всю структуру", - "전체 구조체 재초기화" - ), - code: "s = MyStruct { field1: val1, field2: val2 };" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0383.html" - }] -}; diff --git a/masterror-cli/src/errors/ownership/e0384.rs b/masterror-cli/src/errors/ownership/e0384.rs deleted file mode 100644 index 19696a4..0000000 --- a/masterror-cli/src/errors/ownership/e0384.rs +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0384: cannot assign twice to immutable variable - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0384", - title: LocalizedText::new( - "Cannot assign twice to immutable variable", - "Нельзя присвоить дважды неизменяемой переменной", - "불변 변수에 두 번 할당할 수 없음" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -Variables in Rust are immutable by default. Once a value is bound to a name, -you cannot change it unless you explicitly mark it as mutable with `mut`. - -This is a deliberate design choice that makes code easier to reason about. -When you see a variable without `mut`, you know it won't change.", - "\ -Переменные в Rust неизменяемы по умолчанию. После привязки значения -к имени вы не можете его изменить без явного указания `mut`. - -Это осознанное решение, упрощающее понимание кода. -Если переменная без `mut`, она не изменится.", - "\ -Rust의 변수는 기본적으로 불변입니다. 값이 이름에 바인딩되면 -`mut`로 명시적으로 표시하지 않는 한 변경할 수 없습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Make the variable mutable", - "Сделать переменную изменяемой", - "변수를 가변으로 만들기" - ), - code: "let mut x = 5;\nx = 10;" - }, - FixSuggestion { - description: LocalizedText::new( - "Use shadowing (create new binding)", - "Использовать затенение (новая привязка)", - "섀도잉 사용 (새 바인딩 생성)" - ), - code: "let x = 5;\nlet x = 10; // shadows the first x" - } - ], - links: &[ - DocLink { - title: "Rust Book: Variables and Mutability", - url: "https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html" - }, - DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0384.html" - } - ] -}; diff --git a/masterror-cli/src/errors/ownership/e0505.rs b/masterror-cli/src/errors/ownership/e0505.rs deleted file mode 100644 index e76eec9..0000000 --- a/masterror-cli/src/errors/ownership/e0505.rs +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0505: cannot move out of X because it is borrowed - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0505", - title: LocalizedText::new( - "Cannot move out because it is borrowed", - "Нельзя переместить, так как значение заимствовано", - "빌려져 있어서 이동할 수 없음" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -You're trying to move a value while a borrow of it still exists. -This would invalidate the reference, creating a dangling pointer. - -The borrow must end (go out of scope) before you can move the value. - -Rust tracks the lifetime of all borrows to prevent this at compile time.", - "\ -Вы пытаетесь переместить значение, пока существует его заимствование. -Это сделает ссылку недействительной. - -Заимствование должно закончиться до перемещения значения.", - "\ -빌림이 존재하는 동안 값을 이동하려고 합니다. -이것은 참조를 무효화하여 댕글링 포인터를 만듭니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "End the borrow before moving", - "Завершить заимствование перед перемещением", - "이동 전에 빌림 종료" - ), - code: "{ let r = &x; use(r); } // borrow ends\nmove_value(x);" - }, - FixSuggestion { - description: LocalizedText::new( - "Clone before borrowing", - "Клонировать перед заимствованием", - "빌리기 전에 복제" - ), - code: "let cloned = x.clone();\nlet r = &cloned;\nmove_value(x);" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0505.html" - }] -}; diff --git a/masterror-cli/src/errors/ownership/e0507.rs b/masterror-cli/src/errors/ownership/e0507.rs deleted file mode 100644 index 3df095f..0000000 --- a/masterror-cli/src/errors/ownership/e0507.rs +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0507: cannot move out of borrowed content - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0507", - title: LocalizedText::new( - "Cannot move out of borrowed content", - "Нельзя переместить из заимствованного содержимого", - "빌린 내용에서 이동할 수 없음" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -You're trying to take ownership of a value that you only have a reference to. -References are borrows - they don't own the data. - -Moving out of a reference would leave the original owner with invalid data, -violating Rust's memory safety guarantees. - -Common cases: -- Indexing into a Vec or array with `vec[i]` and trying to own the element -- Dereferencing a reference and trying to move the value -- Pattern matching on borrowed data with ownership patterns", - "\ -Вы пытаетесь забрать владение значением, на которое у вас только ссылка. -Ссылки - это заимствования, они не владеют данными. - -Перемещение из ссылки оставит исходного владельца с недействительными данными. - -Частые случаи: -- Индексация Vec с попыткой забрать элемент -- Разыменование ссылки с попыткой переместить -- Pattern matching на заимствованных данных", - "\ -참조만 있는 값의 소유권을 가져오려고 합니다. -참조는 빌림입니다 - 데이터를 소유하지 않습니다. - -참조에서 이동하면 원래 소유자가 무효한 데이터를 갖게 됩니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new("Clone the value", "Клонировать значение", "값 복제"), - code: "let owned = borrowed.clone();" - }, - FixSuggestion { - description: LocalizedText::new( - "Use mem::take or mem::replace", - "Использовать mem::take или mem::replace", - "mem::take 또는 mem::replace 사용" - ), - code: "let owned = std::mem::take(&mut vec[i]);" - }, - FixSuggestion { - description: LocalizedText::new( - "Use swap_remove for Vec", - "Использовать swap_remove для Vec", - "Vec에 swap_remove 사용" - ), - code: "let owned = vec.swap_remove(i);" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0507.html" - }] -}; diff --git a/masterror-cli/src/errors/ownership/e0509.rs b/masterror-cli/src/errors/ownership/e0509.rs deleted file mode 100644 index 4d39ab1..0000000 --- a/masterror-cli/src/errors/ownership/e0509.rs +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! E0509: cannot move out of type X, which implements the Drop trait - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0509", - title: LocalizedText::new( - "Cannot move out of type which implements Drop", - "Нельзя переместить из типа, реализующего Drop", - "Drop을 구현하는 타입에서 이동할 수 없음" - ), - category: Category::Ownership, - explanation: LocalizedText::new( - "\ -Types that implement Drop have custom cleanup logic that runs when they're -destroyed. Moving a field out would leave the struct in a partially valid -state, and Drop wouldn't know what to clean up. - -Rust prevents this to ensure Drop always sees a valid value.", - "\ -Типы с Drop имеют пользовательскую логику очистки при уничтожении. -Перемещение поля оставит структуру в частично валидном состоянии, -и Drop не будет знать, что очищать. - -Rust предотвращает это для гарантии валидности значения в Drop.", - "\ -Drop을 구현하는 타입은 파괴될 때 실행되는 사용자 정의 정리 로직이 있습니다. -필드를 이동하면 구조체가 부분적으로 유효한 상태가 됩니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new("Clone the field", "Клонировать поле", "필드 복제"), - code: "let field = self.field.clone();" - }, - FixSuggestion { - description: LocalizedText::new( - "Use Option and take()", - "Использовать Option и take()", - "Option과 take() 사용" - ), - code: "struct S { field: Option }\nlet field = self.field.take();" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0509.html" - }] -}; diff --git a/masterror-cli/src/errors/raprogramm.rs b/masterror-cli/src/errors/raprogramm.rs deleted file mode 100644 index 6b61b47..0000000 --- a/masterror-cli/src/errors/raprogramm.rs +++ /dev/null @@ -1,150 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Best practices from RAprogramm's RustManifest. -//! -//! These are not compiler errors but recommendations and patterns -//! from - -mod ra001; -mod ra002; -mod ra003; -mod ra004; -mod ra005; -mod ra006; -mod ra007; -mod ra008; -mod ra009; -mod ra010; -mod ra011; -mod ra012; -mod ra013; -mod ra014; -mod ra015; - -pub use crate::errors::LocalizedText; - -/// Best practice category. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum PracticeCategory { - ErrorHandling, - Performance, - Naming, - Documentation, - Design, - Testing, - Security -} - -impl PracticeCategory { - pub fn name(&self, lang: &str) -> &'static str { - match (self, lang) { - (Self::ErrorHandling, "ru") => "Обработка ошибок", - (Self::ErrorHandling, "ko") => "오류 처리", - (Self::ErrorHandling, _) => "Error Handling", - - (Self::Performance, "ru") => "Производительность", - (Self::Performance, "ko") => "성능", - (Self::Performance, _) => "Performance", - - (Self::Naming, "ru") => "Именование", - (Self::Naming, "ko") => "명명", - (Self::Naming, _) => "Naming", - - (Self::Documentation, "ru") => "Документация", - (Self::Documentation, "ko") => "문서화", - (Self::Documentation, _) => "Documentation", - - (Self::Design, "ru") => "Проектирование", - (Self::Design, "ko") => "설계", - (Self::Design, _) => "Design", - - (Self::Testing, "ru") => "Тестирование", - (Self::Testing, "ko") => "테스트", - (Self::Testing, _) => "Testing", - - (Self::Security, "ru") => "Безопасность", - (Self::Security, "ko") => "보안", - (Self::Security, _) => "Security" - } - } -} - -/// A best practice recommendation. -#[derive(Debug, Clone)] -pub struct BestPractice { - pub code: &'static str, - pub title: LocalizedText, - pub category: PracticeCategory, - pub explanation: LocalizedText, - pub good_example: &'static str, - pub bad_example: &'static str, - pub source: &'static str -} - -static ENTRIES: &[&BestPractice] = &[ - &ra001::ENTRY, - &ra002::ENTRY, - &ra003::ENTRY, - &ra004::ENTRY, - &ra005::ENTRY, - &ra006::ENTRY, - &ra007::ENTRY, - &ra008::ENTRY, - &ra009::ENTRY, - &ra010::ENTRY, - &ra011::ENTRY, - &ra012::ENTRY, - &ra013::ENTRY, - &ra014::ENTRY, - &ra015::ENTRY -]; - -pub fn entries() -> &'static [&'static BestPractice] { - ENTRIES -} - -/// Registry for best practices. -pub struct PracticeRegistry { - practices: std::collections::HashMap<&'static str, &'static BestPractice> -} - -impl PracticeRegistry { - /// Build registry from all practices. - pub fn new() -> Self { - let mut practices = std::collections::HashMap::new(); - for entry in entries() { - practices.insert(entry.code, *entry); - } - Self { - practices - } - } - - /// Find practice by code (RA001, etc.). - pub fn find(&self, code: &str) -> Option<&'static BestPractice> { - let normalized = code.to_uppercase(); - self.practices.get(normalized.as_str()).copied() - } - - /// Get all practices. - pub fn all(&self) -> impl Iterator + '_ { - self.practices.values().copied() - } - - /// Get practices by category. - pub fn by_category(&self, cat: PracticeCategory) -> Vec<&'static BestPractice> { - self.practices - .values() - .filter(|p| p.category == cat) - .copied() - .collect() - } -} - -impl Default for PracticeRegistry { - fn default() -> Self { - Self::new() - } -} diff --git a/masterror-cli/src/errors/raprogramm/ra001.rs b/masterror-cli/src/errors/raprogramm/ra001.rs deleted file mode 100644 index 774eed4..0000000 --- a/masterror-cli/src/errors/raprogramm/ra001.rs +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA001: Never use unwrap() in production code - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA001", - title: LocalizedText::new( - "Never use unwrap() in production code", - "Никогда не используйте unwrap() в продакшене", - "프로덕션 코드에서 unwrap() 사용 금지" - ), - category: PracticeCategory::ErrorHandling, - explanation: LocalizedText::new( - "\ -The Cloudflare November 2025 outage affected 330+ datacenters due to a single -.unwrap(). Configuration change exposed an error case that was never handled. -Result: ChatGPT, X, Canva offline for ~3 hours. - -Always use proper error propagation with Result and the ? operator. -Implement detailed error messages with map_err().", - "\ -Сбой Cloudflare в ноябре 2025 затронул 330+ дата-центров из-за одного .unwrap(). -Изменение конфигурации обнажило случай ошибки, который не был обработан. -Результат: ChatGPT, X, Canva недоступны ~3 часа. - -Всегда используйте правильное распространение ошибок с Result и оператором ?.", - "\ -2025년 11월 Cloudflare 장애는 단일 .unwrap()으로 인해 330개 이상의 데이터센터에 -영향을 미쳤습니다. 구성 변경으로 처리되지 않은 오류 케이스가 노출되었습니다." - ), - good_example: r#"let config = Config::from_file("config.toml") - .map_err(|e| format!("Failed to load config: {}", e))?;"#, - bad_example: r#"let config = Config::from_file("config.toml").unwrap();"#, - source: "https://github.com/RAprogramm/RustManifest#6-panic-avoidance-in-production" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra002.rs b/masterror-cli/src/errors/raprogramm/ra002.rs deleted file mode 100644 index 52c5391..0000000 --- a/masterror-cli/src/errors/raprogramm/ra002.rs +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA002: Use ? operator for error propagation - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA002", - title: LocalizedText::new( - "Use ? operator for error propagation", - "Используйте оператор ? для распространения ошибок", - "오류 전파에 ? 연산자 사용" - ), - category: PracticeCategory::ErrorHandling, - explanation: LocalizedText::new( - "\ -The ? operator is the idiomatic way to handle errors in Rust. -It automatically converts errors and propagates them up the call stack. - -Use ok_or() or ok_or_else() to convert Option to Result with meaningful messages.", - "\ -Оператор ? — идиоматический способ обработки ошибок в Rust. -Он автоматически конвертирует ошибки и распространяет их вверх по стеку вызовов.", - "\ -? 연산자는 Rust에서 오류를 처리하는 관용적인 방법입니다." - ), - good_example: r#"let value = some_option.ok_or("Expected a value")?; -let data = fetch_data().map_err(|e| AppError::Network(e))?;"#, - bad_example: r#"let value = some_option.unwrap(); -let data = fetch_data().expect("fetch failed");"#, - source: "https://github.com/RAprogramm/RustManifest#5-best-practices" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra003.rs b/masterror-cli/src/errors/raprogramm/ra003.rs deleted file mode 100644 index 14b249c..0000000 --- a/masterror-cli/src/errors/raprogramm/ra003.rs +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA003: Avoid unnecessary clone() calls - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA003", - title: LocalizedText::new( - "Avoid unnecessary clone() calls", - "Избегайте ненужных вызовов clone()", - "불필요한 clone() 호출 피하기" - ), - category: PracticeCategory::Performance, - explanation: LocalizedText::new( - "\ -Cloning allocates memory and copies data. Often you can use references instead. -Only clone when you actually need ownership of the data. - -Common anti-patterns: -- Cloning just to satisfy the borrow checker (restructure instead) -- Cloning in a loop (clone once before the loop) -- Cloning when a reference would work", - "\ -Клонирование выделяет память и копирует данные. Часто можно использовать ссылки. -Клонируйте только когда действительно нужно владение данными.", - "\ -클론은 메모리를 할당하고 데이터를 복사합니다. 종종 참조를 대신 사용할 수 있습니다." - ), - good_example: r#"fn process(data: &str) { /* use reference */ } -let owned = expensive_data.clone(); // clone once -for item in &items { process(item); }"#, - bad_example: r#"for item in items { - process(item.clone()); // clones every iteration! -}"#, - source: "https://github.com/RAprogramm/RustManifest#3-code-quality" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra004.rs b/masterror-cli/src/errors/raprogramm/ra004.rs deleted file mode 100644 index ab1caae..0000000 --- a/masterror-cli/src/errors/raprogramm/ra004.rs +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA004: Use descriptive, meaningful names - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA004", - title: LocalizedText::new( - "Use descriptive, meaningful names", - "Используйте описательные, значимые имена", - "설명적이고 의미 있는 이름 사용" - ), - category: PracticeCategory::Naming, - explanation: LocalizedText::new( - "\ -Names must reflect purpose. Avoid generic terms like 'create', 'handle', 'data'. -Descriptive names reduce ambiguity, facilitate easier onboarding, and improve -maintainability. - -Conventions: -- snake_case for variables and functions -- PascalCase for structs and enums -- SCREAMING_SNAKE_CASE for constants", - "\ -Имена должны отражать назначение. Избегайте общих терминов вроде 'create', 'handle', 'data'. -Описательные имена уменьшают неоднозначность и улучшают поддерживаемость.", - "\ -이름은 목적을 반영해야 합니다. 'create', 'handle', 'data' 같은 일반적인 용어를 피하세요." - ), - good_example: r#"fn create_user_handler(req: CreateUserRequest) -> Result -const MAX_RETRY_ATTEMPTS: u32 = 3; -struct UserAuthenticationService { ... }"#, - bad_example: r#"fn create(r: Request) -> Result -const MAX: u32 = 3; -struct Service { ... }"#, - source: "https://github.com/RAprogramm/RustManifest#2-naming-conventions" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra005.rs b/masterror-cli/src/errors/raprogramm/ra005.rs deleted file mode 100644 index 0087cc2..0000000 --- a/masterror-cli/src/errors/raprogramm/ra005.rs +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA005: No inline comments - use docblocks only - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA005", - title: LocalizedText::new( - "No inline comments - use docblocks only", - "Никаких инлайн комментариев - только docblocks", - "인라인 주석 금지 - docblock만 사용" - ), - category: PracticeCategory::Documentation, - explanation: LocalizedText::new( - "\ -Avoid // and /* */ explanations in code. All documentation lives in docblocks: -/// for items, //! for modules. - -Standardized headings for IDE/LSP stability: -- # Overview - Short purpose statement -- # Examples - Minimal, compilable samples -- # Errors - Precise failure modes for Result types -- # Panics - Only if unavoidable -- # Safety - Required if unsafe code present", - "\ -Избегайте // и /* */ объяснений в коде. Вся документация живёт в docblocks: -/// для элементов, //! для модулей.", - "\ -코드에서 // 및 /* */ 설명을 피하세요. 모든 문서는 docblock에." - ), - good_example: r#"/// Fetches user data from the database. -/// -/// # Errors -/// Returns `DbError::NotFound` if user doesn't exist. -/// -/// # Examples -/// ``` -/// let user = fetch_user(42)?; -/// ``` -pub fn fetch_user(id: u64) -> Result"#, - bad_example: r#"// This function fetches user data from the database -// It returns an error if user is not found -pub fn fetch_user(id: u64) -> Result"#, - source: "https://github.com/RAprogramm/RustManifest#8-code-documentation" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra006.rs b/masterror-cli/src/errors/raprogramm/ra006.rs deleted file mode 100644 index ae7a5e1..0000000 --- a/masterror-cli/src/errors/raprogramm/ra006.rs +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA006: Entity naming - no -er suffixes - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA006", - title: LocalizedText::new( - "Entity naming: avoid -er, -or, -manager suffixes", - "Именование сущностей: избегайте суффиксов -er, -or, -manager", - "엔티티 명명: -er, -or, -manager 접미사 피하기" - ), - category: PracticeCategory::Naming, - explanation: LocalizedText::new( - "\ -Structures represent entities, not actions. The -er suffix encourages procedural -thinking that separates data from behavior, creating anemic domain models. -Entity naming naturally unifies data and operations. - -Transforms: -- ConfigLoader → Config -- MessageParser → Message -- RequestHandler → Request -- DataValidator → Data -- ConnectionManager → ConnectionPool - -Exceptions: Iterator, Builder, Visitor, Formatter (established patterns).", - "\ -Структуры представляют сущности, не действия. Суффикс -er поощряет процедурное -мышление, разделяющее данные и поведение. Именование сущностей объединяет их.", - "\ -구조체는 동작이 아닌 엔티티를 나타냅니다. -er 접미사는 절차적 사고를 장려합니다." - ), - good_example: r#"struct Config { ... } -struct Message { ... } -struct Request { ... } -struct ConnectionPool { ... }"#, - bad_example: r#"struct ConfigLoader { ... } -struct MessageParser { ... } -struct RequestHandler { ... } -struct ConnectionManager { ... }"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#1-entity-naming" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra007.rs b/masterror-cli/src/errors/raprogramm/ra007.rs deleted file mode 100644 index b585557..0000000 --- a/masterror-cli/src/errors/raprogramm/ra007.rs +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA007: Method naming - nouns for accessors, verbs for mutators - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA007", - title: LocalizedText::new( - "Method naming: nouns for accessors, verbs for mutators", - "Именование методов: существительные для accessors, глаголы для mutators", - "메서드 명명: accessor는 명사, mutator는 동사" - ), - category: PracticeCategory::Naming, - explanation: LocalizedText::new( - "\ -Method names reflect purpose through grammatical form: -- Accessors (nouns): name(), length(), value() — not get_name() -- Predicates (adjectives): empty(), valid(), published() — not is_empty() -- Mutators (verbs): save(), publish(), delete() - -The get_ prefix adds noise without information. Omitting verbs signals pure -accessors. Adjective predicates read more naturally than is_ constructions.", - "\ -Имена методов отражают назначение через грамматическую форму: -- Accessors: name(), length() — не get_name() -- Predicates: empty(), valid() — не is_empty() -- Mutators: save(), publish(), delete()", - "\ -메서드 이름은 문법적 형태로 목적을 반영합니다." - ), - good_example: r#"impl User { - fn name(&self) -> &str { &self.name } - fn empty(&self) -> bool { self.data.is_empty() } - fn save(&mut self) { ... } -}"#, - bad_example: r#"impl User { - fn get_name(&self) -> &str { &self.name } - fn is_empty(&self) -> bool { self.data.is_empty() } -}"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#2-method-naming" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra008.rs b/masterror-cli/src/errors/raprogramm/ra008.rs deleted file mode 100644 index 9439153..0000000 --- a/masterror-cli/src/errors/raprogramm/ra008.rs +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA008: Structure size - maximum 4 fields - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA008", - title: LocalizedText::new( - "Structure size: maximum 4 fields", - "Размер структуры: максимум 4 поля", - "구조체 크기: 최대 4개 필드" - ), - category: PracticeCategory::Design, - explanation: LocalizedText::new( - "\ -A structure should have no more than 4 fields. More fields indicate multiple -responsibilities requiring composition. - -Problems with large structures: -- Complex testing with many combinations -- Changes ripple through unrelated code -- Purpose becomes unclear -- Parts cannot be reused independently - -Solution: Decompose into focused sub-structures.", - "\ -Структура должна иметь не более 4 полей. Больше полей указывает на -множественные ответственности, требующие композиции.", - "\ -구조체는 4개 이하의 필드를 가져야 합니다. 더 많은 필드는 분해가 필요함을 나타냅니다." - ), - good_example: r#"struct User { - identity: UserIdentity, - credentials: Credentials, - profile: UserProfile, - access: AccessControl, -}"#, - bad_example: r#"struct User { - id: u64, email: String, password_hash: String, - name: String, avatar: Option, bio: String, - created_at: DateTime, updated_at: DateTime, - role: Role, permissions: Vec, - last_login: Option, login_count: u32, - is_verified: bool, verification_token: Option, -}"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#3-structure-size" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra009.rs b/masterror-cli/src/errors/raprogramm/ra009.rs deleted file mode 100644 index 91573b8..0000000 --- a/masterror-cli/src/errors/raprogramm/ra009.rs +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA009: Public API size - maximum 5 methods - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA009", - title: LocalizedText::new( - "Public API size: maximum 5 methods", - "Размер публичного API: максимум 5 методов", - "공개 API 크기: 최대 5개 메서드" - ), - category: PracticeCategory::Design, - explanation: LocalizedText::new( - "\ -A structure's public interface should have no more than 5 methods. -More methods signal the structure does too much. - -Large APIs indicate mixed responsibilities, forcing users to understand more, -expanding documentation and testing complexity. - -Solution: Extract secondary concerns into separate types. -Excludes: trait implementations (Display, Debug, From) and generic new().", - "\ -Публичный интерфейс структуры должен иметь не более 5 методов. -Больше методов означает, что структура делает слишком много.", - "\ -구조체의 공개 인터페이스는 5개 이하의 메서드를 가져야 합니다." - ), - good_example: r#"impl Document { - pub fn new() -> Self { ... } - pub fn load(path: &Path) -> Result { ... } - pub fn save(&self) -> Result<()> { ... } - pub fn content(&self) -> &str { ... } - pub fn metadata(&self) -> &Metadata { ... } -} - -// Rendering is separate -impl Renderer { ... } -// Export is separate -impl Exporter { ... }"#, - bad_example: r#"impl Document { - pub fn new() -> Self { ... } - pub fn load() -> Result { ... } - pub fn save() -> Result<()> { ... } - pub fn content(&self) -> &str { ... } - pub fn metadata(&self) -> &Metadata { ... } - pub fn render_html(&self) -> String { ... } - pub fn render_pdf(&self) -> Vec { ... } - pub fn export_json(&self) -> String { ... } - pub fn validate(&self) -> Result<()> { ... } - // ... 10+ more methods -}"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#4-public-api-size" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra010.rs b/masterror-cli/src/errors/raprogramm/ra010.rs deleted file mode 100644 index 16397f6..0000000 --- a/masterror-cli/src/errors/raprogramm/ra010.rs +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA010: Constructors should only assign fields - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA010", - title: LocalizedText::new( - "Constructors: assignment only, no logic", - "Конструкторы: только присваивание, никакой логики", - "생성자: 할당만, 로직 없음" - ), - category: PracticeCategory::Design, - explanation: LocalizedText::new( - "\ -Constructors should only assign fields. All processing, validation, and I/O -belong in methods. - -Problems with logic in constructors: -- Constructors can fail, complicating object creation -- Work happens eagerly even if unused -- Inflexible creation paths -- Hard to test without real resources - -Benefits of assignment-only constructors: -- Infallible object creation -- Lazy evaluation of expensive work -- Multiple creation paths (from_data() for tests)", - "\ -Конструкторы должны только присваивать поля. Вся обработка, валидация и I/O -принадлежат методам.", - "\ -생성자는 필드만 할당해야 합니다. 모든 처리, 검증, I/O는 메서드에." - ), - good_example: r#"impl Server { - pub fn new(config: Config) -> Self { - Self { config, connection: None } - } - - pub fn connect(&mut self) -> Result<()> { - self.connection = Some(Connection::establish(&self.config)?); - Ok(()) - } -}"#, - bad_example: r#"impl Server { - pub fn new(config: Config) -> Result { - let connection = Connection::establish(&config)?; // I/O in constructor! - validate_config(&config)?; // Logic in constructor! - Ok(Self { config, connection }) - } -}"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#5-constructor-design" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra011.rs b/masterror-cli/src/errors/raprogramm/ra011.rs deleted file mode 100644 index a837c1b..0000000 --- a/masterror-cli/src/errors/raprogramm/ra011.rs +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA011: Immutability first - prefer self over &mut self - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA011", - title: LocalizedText::new( - "Immutability first: prefer self over &mut self", - "Сначала неизменяемость: предпочитайте self вместо &mut self", - "불변성 우선: &mut self보다 self 선호" - ), - category: PracticeCategory::Design, - explanation: LocalizedText::new( - "\ -Prefer returning new objects over mutating existing ones. Use `self` instead -of `&mut self` where practical. - -Problems with mutable objects: -- Shared state bugs from unexpected modifications -- Thread safety requires synchronization -- Temporal coupling makes operation order matter -- Incomplete state during configuration - -Exceptions: Large data structures, I/O, performance-critical loops, Iterator::next", - "\ -Предпочитайте возврат новых объектов вместо изменения существующих. -Используйте `self` вместо `&mut self` где возможно.", - "\ -기존 객체를 변경하는 것보다 새 객체를 반환하는 것을 선호하세요." - ), - good_example: r#"Request::new(url) - .header("Content-Type", "application/json") - .body(payload) - .send()"#, - bad_example: r#"let mut req = Request::new(url); -req.set_header("Content-Type", "application/json"); -req.set_body(payload); -req.send()"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#7-immutability-first" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra012.rs b/masterror-cli/src/errors/raprogramm/ra012.rs deleted file mode 100644 index 8274d8c..0000000 --- a/masterror-cli/src/errors/raprogramm/ra012.rs +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA012: Constant encapsulation - associate with types - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA012", - title: LocalizedText::new( - "Encapsulate constants in their types", - "Инкапсулируйте константы в их типы", - "상수를 타입에 캡슐화" - ), - category: PracticeCategory::Design, - explanation: LocalizedText::new( - "\ -Constants belong to structures using them, not global scope. This improves -discoverability and prevents namespace pollution. - -Benefits: -- Clear discovery location -- Built-in documentation -- Automatic namespacing -- Encapsulation -- Easy refactoring", - "\ -Константы принадлежат структурам, которые их используют, а не глобальной области. -Это улучшает обнаруживаемость и предотвращает загрязнение пространства имён.", - "\ -상수는 전역 범위가 아닌 사용하는 구조체에 속합니다." - ), - good_example: r#"impl ConnectionPool { - pub const MAX_SIZE: usize = 100; -} - -impl Client { - pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); -} - -// Usage: ConnectionPool::MAX_SIZE"#, - bad_example: r#"const MAX_POOL_SIZE: usize = 100; -const DEFAULT_CLIENT_TIMEOUT: Duration = Duration::from_secs(30); -const MAX_RETRIES: u32 = 3; -const DEFAULT_PORT: u16 = 8080; -// ... scattered constants"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#8-constant-encapsulation" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra013.rs b/masterror-cli/src/errors/raprogramm/ra013.rs deleted file mode 100644 index 306b810..0000000 --- a/masterror-cli/src/errors/raprogramm/ra013.rs +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA013: Testing with fakes over mocks - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA013", - title: LocalizedText::new( - "Use fakes over mocks for testing", - "Используйте fakes вместо mocks для тестирования", - "테스트에 mock보다 fake 사용" - ), - category: PracticeCategory::Testing, - explanation: LocalizedText::new( - "\ -Use simple fake implementations instead of mock libraries. Fakes provide real -behavior; mocks verify call sequences. - -| Aspect | Mocks | Fakes | -|--------|-------|-------| -| Coupling | High | Low | -| Maintenance | Breaks on refactoring | Survives changes | -| Behavior | Simulates | Provides real | -| Debugging | Cryptic | Standard | - -Mock appropriateness: Verifying external system interactions, ensuring methods -are NOT called, testing strict interaction ordering.", - "\ -Используйте простые fake-реализации вместо mock-библиотек. Fakes обеспечивают -реальное поведение; mocks проверяют последовательности вызовов.", - "\ -mock 라이브러리 대신 간단한 fake 구현을 사용하세요." - ), - good_example: r#"struct FakeDatabase { - users: HashMap, -} - -impl FakeDatabase { - fn new() -> Self { Self { users: HashMap::new() } } - fn insert(&mut self, user: User) { self.users.insert(user.id, user); } -} - -impl Database for FakeDatabase { - fn find_user(&self, id: u64) -> Option<&User> { - self.users.get(&id) - } -}"#, - bad_example: r#"#[test] -fn test_user_service() { - let mut mock = MockDatabase::new(); - mock.expect_find_user() - .with(eq(42)) - .times(1) - .returning(|_| Some(User::default())); - // Breaks when implementation changes -}"#, - source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#9-testing-with-fakes" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra014.rs b/masterror-cli/src/errors/raprogramm/ra014.rs deleted file mode 100644 index 4301b08..0000000 --- a/masterror-cli/src/errors/raprogramm/ra014.rs +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA014: Pre-allocate with Vec::with_capacity - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA014", - title: LocalizedText::new( - "Pre-allocate with Vec::with_capacity", - "Предвыделяйте память с Vec::with_capacity", - "Vec::with_capacity로 사전 할당" - ), - category: PracticeCategory::Performance, - explanation: LocalizedText::new( - "\ -When you know the approximate size of a Vec, pre-allocate to avoid reallocations. -Each reallocation copies all existing elements to new memory. - -This is especially important in hot paths and loops.", - "\ -Когда знаете примерный размер Vec, предвыделяйте чтобы избежать реаллокаций. -Каждая реаллокация копирует все элементы в новую память.", - "\ -Vec의 대략적인 크기를 알 때, 재할당을 피하기 위해 사전 할당하세요." - ), - good_example: r#"let mut results = Vec::with_capacity(items.len()); -for item in items { - results.push(process(item)); -}"#, - bad_example: r#"let mut results = Vec::new(); // starts with 0 capacity -for item in items { - results.push(process(item)); // reallocates multiple times! -}"#, - source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" -}; diff --git a/masterror-cli/src/errors/raprogramm/ra015.rs b/masterror-cli/src/errors/raprogramm/ra015.rs deleted file mode 100644 index 0bfd79c..0000000 --- a/masterror-cli/src/errors/raprogramm/ra015.rs +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! RA015: Avoid O(n²) algorithms - -use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; - -pub static ENTRY: BestPractice = BestPractice { - code: "RA015", - title: LocalizedText::new( - "Avoid O(n²) algorithms", - "Избегайте алгоритмов O(n²)", - "O(n²) 알고리즘 피하기" - ), - category: PracticeCategory::Performance, - explanation: LocalizedText::new( - "\ -Nested loops over the same data often indicate O(n²) complexity. -Use HashSet/HashMap for lookups, or sort + binary search. - -What looks fine with 100 items becomes unusable with 10,000.", - "\ -Вложенные циклы по одним данным часто указывают на O(n²) сложность. -Используйте HashSet/HashMap для поиска или сортировку + бинарный поиск.", - "\ -같은 데이터에 대한 중첩 루프는 종종 O(n²) 복잡도를 나타냅니다." - ), - good_example: r#"let seen: HashSet<_> = items.iter().collect(); -for item in other_items { - if seen.contains(&item) { // O(1) lookup - // ... - } -}"#, - bad_example: r#"for item in other_items { - for existing in &items { // O(n) for each = O(n²) total - if item == existing { - // ... - } - } -}"#, - source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" -}; diff --git a/masterror-cli/src/errors/resolution.rs b/masterror-cli/src/errors/resolution.rs deleted file mode 100644 index 42f17d8..0000000 --- a/masterror-cli/src/errors/resolution.rs +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Name resolution errors. - -mod e0412; -mod e0425; -mod e0433; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[&e0412::ENTRY, &e0425::ENTRY, &e0433::ENTRY]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/resolution/e0412.rs b/masterror-cli/src/errors/resolution/e0412.rs deleted file mode 100644 index 32a9aa1..0000000 --- a/masterror-cli/src/errors/resolution/e0412.rs +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0412", - title: LocalizedText::new( - "Cannot find type in this scope", - "Не удаётся найти тип в этой области видимости", - "이 스코프에서 타입을 찾을 수 없음" - ), - category: Category::Resolution, - explanation: LocalizedText::new( - "The type you're referencing doesn't exist or isn't in scope.", - "Тип, на который вы ссылаетесь, не существует или не в области видимости.", - "참조하는 타입이 존재하지 않거나 스코프에 없습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new("Import the type", "Импортировать тип", "타입 import"), - code: "use crate::types::MyType;" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0412.html" - }] -}; diff --git a/masterror-cli/src/errors/resolution/e0425.rs b/masterror-cli/src/errors/resolution/e0425.rs deleted file mode 100644 index b973d07..0000000 --- a/masterror-cli/src/errors/resolution/e0425.rs +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0425", - title: LocalizedText::new( - "Cannot find value in this scope", - "Не удаётся найти значение в этой области видимости", - "이 스코프에서 값을 찾을 수 없음" - ), - category: Category::Resolution, - explanation: LocalizedText::new( - "You're using a variable, function, or constant that doesn't exist in scope.", - "Вы используете переменную, функцию или константу, которая не существует в текущей области.", - "스코프에 존재하지 않는 변수, 함수 또는 상수를 사용하고 있습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Declare the variable", - "Объявить переменную", - "변수 선언" - ), - code: "let x = 10;" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0425.html" - }] -}; diff --git a/masterror-cli/src/errors/resolution/e0433.rs b/masterror-cli/src/errors/resolution/e0433.rs deleted file mode 100644 index b9e4d19..0000000 --- a/masterror-cli/src/errors/resolution/e0433.rs +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0433", - title: LocalizedText::new( - "Failed to resolve: use of undeclared crate or module", - "Не удалось разрешить: необъявленный крейт или модуль", - "해결 실패: 선언되지 않은 크레이트 또는 모듈" - ), - category: Category::Resolution, - explanation: LocalizedText::new( - "Rust can't find the crate, module, or type you're trying to use.", - "Rust не может найти крейт, модуль или тип.", - "Rust가 크레이트, 모듈 또는 타입을 찾을 수 없습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new("Add use statement", "Добавить use", "use 문 추가"), - code: "use std::collections::HashMap;" - }, - FixSuggestion { - description: LocalizedText::new( - "Add dependency", - "Добавить зависимость", - "의존성 추가" - ), - code: "[dependencies]\nserde = \"1.0\"" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0433.html" - }] -}; diff --git a/masterror-cli/src/errors/traits.rs b/masterror-cli/src/errors/traits.rs deleted file mode 100644 index d402807..0000000 --- a/masterror-cli/src/errors/traits.rs +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Trait-related errors. - -mod e0038; -mod e0282; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[&e0038::ENTRY, &e0282::ENTRY]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/traits/e0038.rs b/masterror-cli/src/errors/traits/e0038.rs deleted file mode 100644 index 9055739..0000000 --- a/masterror-cli/src/errors/traits/e0038.rs +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0038", - title: LocalizedText::new( - "Trait cannot be made into an object", - "Трейт не может быть превращён в объект", - "트레이트를 객체로 만들 수 없음" - ), - category: Category::Traits, - explanation: LocalizedText::new( - "This trait is not object-safe - it can't be used as `dyn Trait`.", - "Этот трейт не объектно-безопасен - его нельзя использовать как `dyn Trait`.", - "이 트레이트는 객체 안전하지 않습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new("Use generics", "Использовать обобщения", "제네릭 사용"), - code: "fn process(item: T) { ... }" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0038.html" - }] -}; diff --git a/masterror-cli/src/errors/traits/e0282.rs b/masterror-cli/src/errors/traits/e0282.rs deleted file mode 100644 index 1861285..0000000 --- a/masterror-cli/src/errors/traits/e0282.rs +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0282", - title: LocalizedText::new( - "Type annotations needed", - "Требуются аннотации типа", - "타입 어노테이션이 필요함" - ), - category: Category::Traits, - explanation: LocalizedText::new( - "The compiler cannot infer the type. Provide an explicit type annotation.", - "Компилятор не может вывести тип. Укажите явную аннотацию типа.", - "컴파일러가 타입을 추론할 수 없습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Add type annotation", - "Добавить аннотацию", - "타입 어노테이션 추가" - ), - code: "let numbers: Vec = input.parse().unwrap();" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0282.html" - }] -}; diff --git a/masterror-cli/src/errors/types.rs b/masterror-cli/src/errors/types.rs deleted file mode 100644 index 8cf39da..0000000 --- a/masterror-cli/src/errors/types.rs +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Type-related errors. - -mod e0277; -mod e0308; -mod e0599; - -use super::ErrorEntry; - -static ENTRIES: &[&ErrorEntry] = &[&e0277::ENTRY, &e0308::ENTRY, &e0599::ENTRY]; - -pub fn entries() -> &'static [&'static ErrorEntry] { - ENTRIES -} diff --git a/masterror-cli/src/errors/types/e0277.rs b/masterror-cli/src/errors/types/e0277.rs deleted file mode 100644 index e054ab2..0000000 --- a/masterror-cli/src/errors/types/e0277.rs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0277", - title: LocalizedText::new( - "Trait bound not satisfied", - "Ограничение трейта не выполнено", - "트레이트 바운드가 충족되지 않음" - ), - category: Category::Types, - explanation: LocalizedText::new( - "A generic function or type requires a trait bound that your type doesn't satisfy.", - "Обобщённая функция или тип требует ограничение трейта, которому ваш тип не удовлетворяет.", - "제네릭 함수나 타입이 당신의 타입이 충족하지 않는 트레이트 바운드를 요구합니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new( - "Derive the trait", - "Получить через derive", - "트레이트 derive" - ), - code: "#[derive(Hash, Eq, PartialEq)]" - }, - FixSuggestion { - description: LocalizedText::new( - "Implement manually", - "Реализовать вручную", - "수동 구현" - ), - code: "impl MyTrait for MyType { ... }" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0277.html" - }] -}; diff --git a/masterror-cli/src/errors/types/e0308.rs b/masterror-cli/src/errors/types/e0308.rs deleted file mode 100644 index a01246f..0000000 --- a/masterror-cli/src/errors/types/e0308.rs +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0308", - title: LocalizedText::new("Mismatched types", "Несовпадение типов", "타입 불일치"), - category: Category::Types, - explanation: LocalizedText::new( - "Rust is statically typed and does NOT perform implicit type conversions.", - "Rust статически типизирован и НЕ выполняет неявные преобразования типов.", - "Rust는 정적 타입 언어이며 암시적 타입 변환을 수행하지 않습니다." - ), - fixes: &[ - FixSuggestion { - description: LocalizedText::new("Use parse()", "Использовать parse()", "parse() 사용"), - code: "let n: i32 = s.parse().unwrap();" - }, - FixSuggestion { - description: LocalizedText::new("Use 'as'", "Использовать 'as'", "'as' 사용"), - code: "let n = x as i32;" - } - ], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0308.html" - }] -}; diff --git a/masterror-cli/src/errors/types/e0599.rs b/masterror-cli/src/errors/types/e0599.rs deleted file mode 100644 index 84a2802..0000000 --- a/masterror-cli/src/errors/types/e0599.rs +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; - -pub static ENTRY: ErrorEntry = ErrorEntry { - code: "E0599", - title: LocalizedText::new( - "No method named X found for type", - "Метод не найден для типа", - "타입에서 메서드를 찾을 수 없음" - ), - category: Category::Types, - explanation: LocalizedText::new( - "You're calling a method that doesn't exist on this type. Check trait imports.", - "Вы вызываете метод, который не существует для этого типа. Проверьте импорт трейтов.", - "이 타입에 존재하지 않는 메서드를 호출하고 있습니다." - ), - fixes: &[FixSuggestion { - description: LocalizedText::new( - "Import the trait", - "Импортировать трейт", - "트레이트 import" - ), - code: "use std::io::Read;" - }], - links: &[DocLink { - title: "Error Code Reference", - url: "https://doc.rust-lang.org/error_codes/E0599.html" - }] -}; diff --git a/masterror-cli/src/locale.rs b/masterror-cli/src/locale.rs deleted file mode 100644 index 03d30e1..0000000 --- a/masterror-cli/src/locale.rs +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Localization system for masterror-cli. -#![allow(dead_code)] - -mod en; -#[cfg(feature = "lang-ko")] -mod ko; -#[cfg(feature = "lang-ru")] -mod ru; - -use std::collections::HashMap; - -/// Locale with messages and error translations. -pub struct Locale { - messages: HashMap<&'static str, &'static str>, - translations: HashMap<&'static str, &'static str>, - lang: String -} - -impl Locale { - /// Create locale for given language code. - pub fn new(lang: &str) -> Self { - let (messages, translations) = match lang { - #[cfg(feature = "lang-ru")] - "ru" => (ru::messages(), ru::translations()), - #[cfg(feature = "lang-ko")] - "ko" => (ko::messages(), ko::translations()), - _ => (en::messages(), HashMap::new()) - }; - Self { - messages, - translations, - lang: lang.to_string() - } - } - - /// Get localized message by key. - pub fn get<'a>(&'a self, key: &'a str) -> &'a str { - self.messages.get(key).copied().unwrap_or(key) - } - - /// Get full translated error message by code. - pub fn translate_error(&self, error_code: &str, _original_msg: &str) -> Option<&'static str> { - if self.lang == "en" { - return None; - } - // Get full translation by error code from messages - let key = format!("{}-translation", error_code.to_lowercase()); - self.messages.get(key.as_str()).copied() - } - - /// Check if translation field should be shown. - pub fn has_translation(&self) -> bool { - self.lang != "en" - } - - /// Get language code. - pub fn lang(&self) -> &str { - &self.lang - } - - /// Translate full rendered compiler output. - pub fn translate_rendered(&self, rendered: &str) -> String { - if self.lang == "en" { - return rendered.to_string(); - } - - let mut result = rendered.to_string(); - - // Sort by length descending to replace longer phrases first - let mut pairs: Vec<_> = self.translations.iter().collect(); - pairs.sort_by(|a, b| b.0.len().cmp(&a.0.len())); - - for (en, translated) in pairs { - result = result.replace(en, translated); - } - - result - } -} diff --git a/masterror-cli/src/locale/en.rs b/masterror-cli/src/locale/en.rs deleted file mode 100644 index 3e3583f..0000000 --- a/masterror-cli/src/locale/en.rs +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! English locale. - -use std::collections::HashMap; - -pub fn messages() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - - // Labels - m.insert("label-translation", "Translation:"); - m.insert("label-why", "Why:"); - m.insert("label-fix", "Fix:"); - m.insert("label-link", "Learn more:"); - - // Categories - m.insert("category-ownership", "Ownership"); - m.insert("category-types", "Types"); - m.insert("category-lifetimes", "Lifetimes"); - m.insert("category-borrowing", "Borrowing"); - - // E0382 - Use of moved value - m.insert("e0382-title", "Use of moved value"); - m.insert( - "e0382-explanation", - "\ -In Rust, each value has exactly one owner at a time. This is the foundation -of Rust's memory safety guarantees without garbage collection. - -When you assign a value to another variable or pass it to a function, -ownership MOVES to the new location. The original variable becomes invalid -and cannot be used anymore. - -This happens because Rust needs to know exactly when to free memory. -With one owner, there's no ambiguity about who is responsible for cleanup." - ); - m.insert( - "e0382-fix-clone-desc", - "Clone the value (creates a deep copy)" - ); - m.insert( - "e0382-fix-borrow-desc", - "Borrow with a reference (no copy, shared access)" - ); - m.insert( - "e0382-fix-copy-desc", - "Implement Copy trait (for small, stack-only types)" - ); - - // E0502 - Cannot borrow as mutable (already borrowed as immutable) - m.insert( - "e0502-title", - "Cannot borrow as mutable (already borrowed as immutable)" - ); - m.insert( - "e0502-explanation", - "\ -Rust enforces a strict borrowing rule: you can have EITHER one mutable -reference OR any number of immutable references, but never both at once. - -This prevents data races at compile time. If you could mutate data while -someone else is reading it, the reader might see inconsistent state. - -The immutable borrow is still \"active\" because it's used later in code. -Rust tracks lifetimes to ensure references don't outlive their data." - ); - m.insert( - "e0502-fix-scope-desc", - "End the immutable borrow before mutating" - ); - m.insert("e0502-fix-clone-desc", "Clone the data before mutation"); - - // E0499 - Cannot borrow as mutable more than once - m.insert("e0499-title", "Cannot borrow as mutable more than once"); - m.insert( - "e0499-explanation", - "\ -Rust allows only ONE mutable reference to data at a time. This is stricter -than the immutable borrowing rule and prevents all aliased mutation. - -Why? Two mutable references to the same data could lead to: -- Data races in concurrent code -- Iterator invalidation -- Dangling pointers after reallocation - -This rule is checked at compile time, giving you fearless concurrency." - ); - m.insert( - "e0499-fix-scope-desc", - "Use scopes to limit mutable borrow lifetime" - ); - m.insert( - "e0499-fix-refcell-desc", - "Use RefCell for interior mutability (runtime checks)" - ); - - // E0308 - Mismatched types - m.insert("e0308-title", "Mismatched types"); - m.insert( - "e0308-explanation", - "\ -Rust is statically typed and does NOT perform implicit type conversions. -Every value has a specific type, and the compiler ensures type consistency. - -This catches bugs at compile time that would be runtime errors in other -languages. The type system is your friend, not an obstacle." - ); - m.insert( - "e0308-fix-convert-desc", - "Use parse() for string to number conversion" - ); - m.insert("e0308-fix-as-desc", "Use 'as' for numeric type casting"); - - // E0106 - Missing lifetime specifier - m.insert("e0106-title", "Missing lifetime specifier"); - m.insert( - "e0106-explanation", - "\ -References in Rust have lifetimes - they describe how long the reference -is valid. Usually the compiler infers lifetimes, but sometimes you must -be explicit. - -Lifetime annotations don't change how long values live. They describe -relationships between references so the compiler can verify safety." - ); - m.insert("e0106-fix-lifetime-desc", "Add explicit lifetime parameter"); - m.insert( - "e0106-fix-owned-desc", - "Use owned type instead of reference" - ); - - // E0597 - Value does not live long enough - m.insert("e0597-title", "Value does not live long enough"); - m.insert( - "e0597-explanation", - "\ -You're creating a reference to something that will be destroyed before -the reference is used. This would create a dangling pointer. - -Rust prevents this at compile time. The referenced value must live at -least as long as the reference itself." - ); - m.insert("e0597-fix-move-desc", "Move value to outer scope"); - m.insert( - "e0597-fix-owned-desc", - "Return owned value instead of reference" - ); - - m -} diff --git a/masterror-cli/src/locale/ko.rs b/masterror-cli/src/locale/ko.rs deleted file mode 100644 index b275ab7..0000000 --- a/masterror-cli/src/locale/ko.rs +++ /dev/null @@ -1,241 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Korean locale. - -use std::collections::HashMap; - -pub fn messages() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - - // Labels - m.insert("label-translation", "번역:"); - m.insert("label-why", "원인:"); - m.insert("label-fix", "해결:"); - m.insert("label-link", "링크:"); - - // Categories - m.insert("category-ownership", "소유권"); - m.insert("category-types", "타입"); - m.insert("category-lifetimes", "라이프타임"); - m.insert("category-borrowing", "빌림"); - - // E0382 - Use of moved value - m.insert("e0382-title", "이동된 값 사용"); - m.insert("e0382-translation", "이동된 값의 빌림"); - m.insert( - "e0382-explanation", - "\ -Rust에서 각 값은 정확히 하나의 소유자를 가집니다. 이것이 가비지 컬렉터 없이 -메모리 안전성을 보장하는 기반입니다. - -값을 다른 변수에 할당하거나 함수에 전달하면 소유권이 새 위치로 이동합니다. -원래 변수는 무효화되어 더 이상 사용할 수 없습니다. - -이는 Rust가 메모리를 언제 해제해야 하는지 정확히 알아야 하기 때문입니다. -소유자가 하나이면 정리 책임이 명확합니다." - ); - m.insert("e0382-fix-clone-desc", "값을 복제 (깊은 복사)"); - m.insert("e0382-fix-borrow-desc", "참조로 빌림 (복사 없음)"); - m.insert("e0382-fix-copy-desc", "Copy 트레이트 구현 (작은 타입용)"); - - // E0502 - Cannot borrow as mutable (already borrowed as immutable) - m.insert("e0502-title", "가변으로 빌릴 수 없음 (이미 불변으로 빌림)"); - m.insert( - "e0502-translation", - "이미 불변으로 빌려서 가변으로 빌릴 수 없음" - ); - m.insert( - "e0502-explanation", - "\ -Rust는 엄격한 빌림 규칙을 적용합니다: 하나의 가변 참조 또는 여러 불변 참조를 -가질 수 있지만, 동시에 둘 다 가질 수는 없습니다. - -이는 컴파일 시 데이터 경쟁을 방지합니다. 다른 사람이 읽는 동안 데이터를 -변경할 수 있다면, 읽는 사람은 일관성 없는 상태를 볼 수 있습니다. - -불변 빌림은 코드 뒤에서 사용되기 때문에 여전히 \"활성\" 상태입니다." - ); - m.insert("e0502-fix-scope-desc", "변경 전에 불변 빌림 종료"); - m.insert("e0502-fix-clone-desc", "변경 전에 데이터 복제"); - - // E0499 - Cannot borrow as mutable more than once - m.insert("e0499-title", "가변으로 두 번 이상 빌릴 수 없음"); - m.insert( - "e0499-translation", - "동시에 가변으로 두 번 이상 빌릴 수 없음" - ); - m.insert( - "e0499-explanation", - "\ -Rust는 데이터에 대해 한 번에 하나의 가변 참조만 허용합니다. -이는 불변 빌림 규칙보다 엄격하며 모든 별명 변경을 방지합니다. - -왜? 동일한 데이터에 대한 두 개의 가변 참조는 다음을 초래할 수 있습니다: -- 동시 코드에서 데이터 경쟁 -- 반복자 무효화 -- 재할당 후 댕글링 포인터 - -이 규칙은 컴파일 시 확인되어 fearless concurrency를 제공합니다." - ); - m.insert("e0499-fix-scope-desc", "스코프를 사용하여 빌림 수명 제한"); - m.insert( - "e0499-fix-refcell-desc", - "내부 가변성을 위해 RefCell 사용 (런타임 검사)" - ); - - // E0308 - Mismatched types - m.insert("e0308-title", "타입 불일치"); - m.insert("e0308-translation", "타입 불일치"); - m.insert( - "e0308-explanation", - "\ -Rust는 정적 타입 언어이며 암시적 타입 변환을 수행하지 않습니다. -모든 값에는 특정 타입이 있으며 컴파일러가 타입 일관성을 보장합니다. - -이는 다른 언어에서 런타임 오류가 될 버그를 컴파일 시 잡습니다. -타입 시스템은 장애물이 아니라 친구입니다." - ); - m.insert( - "e0308-fix-convert-desc", - "문자열을 숫자로 변환하려면 parse() 사용" - ); - m.insert("e0308-fix-as-desc", "숫자 타입 캐스팅에 'as' 사용"); - - // E0106 - Missing lifetime specifier - m.insert("e0106-title", "라이프타임 지정자 누락"); - m.insert("e0106-translation", "라이프타임 지정자 누락"); - m.insert( - "e0106-explanation", - "\ -Rust의 참조에는 라이프타임이 있습니다 - 참조가 얼마나 오래 유효한지 설명합니다. -보통 컴파일러가 라이프타임을 추론하지만, 때로는 명시해야 합니다. - -라이프타임 어노테이션은 값이 얼마나 오래 사는지 변경하지 않습니다. -컴파일러가 안전성을 확인할 수 있도록 참조 간의 관계를 설명합니다." - ); - m.insert("e0106-fix-lifetime-desc", "명시적 라이프타임 매개변수 추가"); - m.insert("e0106-fix-owned-desc", "참조 대신 소유 타입 사용"); - - // E0597 - Value does not live long enough - m.insert("e0597-title", "값이 충분히 오래 살지 않음"); - m.insert("e0597-translation", "값이 충분히 오래 살지 않음"); - m.insert( - "e0597-explanation", - "\ -참조가 사용되기 전에 파괴될 것에 대한 참조를 만들고 있습니다. -이는 댕글링 포인터를 생성합니다. - -Rust는 컴파일 시 이를 방지합니다. 참조되는 값은 적어도 참조 자체만큼 -오래 살아야 합니다." - ); - m.insert("e0597-fix-move-desc", "값을 외부 스코프로 이동"); - m.insert("e0597-fix-owned-desc", "참조 대신 소유 값 반환"); - - m -} - -pub fn translations() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - - // Error headers - m.insert("error", "오류"); - m.insert("warning", "경고"); - m.insert("note", "참고"); - m.insert("help", "도움말"); - - // E0382 - borrow of moved value - m.insert("borrow of moved value", "이동된 값의 빌림"); - m.insert("move occurs because", "이동이 발생하는 이유:"); - m.insert( - "which does not implement the `Copy` trait", - "`Copy` 트레이트를 구현하지 않음" - ); - m.insert("value moved here", "값이 여기서 이동됨"); - m.insert( - "value borrowed here after move", - "이동 후 여기서 값이 빌림됨" - ); - m.insert( - "consider cloning the value if the performance cost is acceptable", - "성능 비용이 허용되면 값을 복제하는 것을 고려하세요" - ); - - // E0502 - cannot borrow as mutable - m.insert("cannot borrow", "빌릴 수 없음"); - m.insert( - "as mutable because it is also borrowed as immutable", - "가변으로 (이미 불변으로 빌림)" - ); - m.insert("immutable borrow occurs here", "불변 빌림이 여기서 발생"); - m.insert("mutable borrow occurs here", "가변 빌림이 여기서 발생"); - m.insert( - "immutable borrow later used here", - "불변 빌림이 여기서 나중에 사용됨" - ); - - // E0499 - cannot borrow as mutable more than once - m.insert( - "as mutable more than once at a time", - "동시에 가변으로 두 번 이상" - ); - m.insert( - "first mutable borrow occurs here", - "첫 번째 가변 빌림이 여기서 발생" - ); - m.insert( - "second mutable borrow occurs here", - "두 번째 가변 빌림이 여기서 발생" - ); - m.insert( - "first borrow later used here", - "첫 번째 빌림이 여기서 나중에 사용됨" - ); - - // E0308 - mismatched types - m.insert("mismatched types", "타입 불일치"); - m.insert("expected", "예상"); - m.insert("found", "발견"); - m.insert("expected type", "예상 타입"); - m.insert("found type", "발견된 타입"); - m.insert("this expression has type", "이 표현식의 타입:"); - - // E0106 - missing lifetime - m.insert("missing lifetime specifier", "라이프타임 지정자 누락"); - m.insert( - "expected named lifetime parameter", - "명명된 라이프타임 매개변수 예상" - ); - - // E0597 - does not live long enough - m.insert("does not live long enough", "충분히 오래 살지 않음"); - m.insert( - "borrowed value does not live long enough", - "빌린 값이 충분히 오래 살지 않음" - ); - m.insert( - "dropped here while still borrowed", - "아직 빌린 상태에서 여기서 삭제됨" - ); - - // Common phrases - m.insert("has type", "타입을 가짐"); - m.insert("consider", "고려하세요"); - m.insert( - "this error originates in the macro", - "이 오류는 매크로에서 발생" - ); - m.insert("run with", "실행:"); - m.insert( - "for more info about this issue", - "이 문제에 대한 자세한 정보" - ); - m.insert("aborting due to", "중단 원인:"); - m.insert("previous error", "이전 오류"); - m.insert("previous errors", "이전 오류들"); - m.insert("could not compile", "컴파일 실패"); - m.insert("due to", "원인:"); - - m -} diff --git a/masterror-cli/src/locale/ru.rs b/masterror-cli/src/locale/ru.rs deleted file mode 100644 index 83d507b..0000000 --- a/masterror-cli/src/locale/ru.rs +++ /dev/null @@ -1,297 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Russian locale. - -use std::collections::HashMap; - -pub fn messages() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - - // Labels - m.insert("label-translation", "Перевод:"); - m.insert("label-why", "Причина:"); - m.insert("label-fix", "Решение:"); - m.insert("label-link", "Ссылки:"); - - // Categories - m.insert("category-ownership", "Владение"); - m.insert("category-types", "Типы"); - m.insert("category-lifetimes", "Времена жизни"); - m.insert("category-borrowing", "Заимствование"); - - // E0382 - Use of moved value - m.insert("e0382-title", "Использование перемещённого значения"); - m.insert("e0382-translation", "заимствование перемещённого значения"); - m.insert( - "e0382-explanation", - "\ -В Rust у каждого значения ровно один владелец в каждый момент времени. -Это основа гарантий безопасности памяти без сборщика мусора. - -Когда вы присваиваете значение другой переменной или передаёте в функцию, -владение ПЕРЕМЕЩАЕТСЯ в новое место. Исходная переменная становится -недействительной и не может использоваться. - -Это происходит потому, что Rust должен точно знать, когда освобождать память. -С одним владельцем нет неоднозначности в том, кто отвечает за очистку." - ); - m.insert( - "e0382-fix-clone-desc", - "Клонировать значение (глубокое копирование)" - ); - m.insert( - "e0382-fix-borrow-desc", - "Заимствовать через ссылку (без копирования)" - ); - m.insert( - "e0382-fix-copy-desc", - "Реализовать трейт Copy (для маленьких типов)" - ); - - // E0502 - Cannot borrow as mutable (already borrowed as immutable) - m.insert( - "e0502-title", - "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)" - ); - m.insert( - "e0502-translation", - "нельзя заимствовать как изменяемое, т.к. уже заимствовано как неизменяемое" - ); - m.insert( - "e0502-explanation", - "\ -Rust применяет строгое правило заимствования: можно иметь ЛИБО одну -изменяемую ссылку, ЛИБО любое количество неизменяемых, но никогда оба сразу. - -Это предотвращает гонки данных на этапе компиляции. Если бы можно было -изменять данные, пока кто-то их читает, читатель мог бы увидеть -несогласованное состояние. - -Неизменяемое заимствование всё ещё \"активно\", потому что используется -дальше в коде. Rust отслеживает времена жизни ссылок." - ); - m.insert( - "e0502-fix-scope-desc", - "Завершить неизменяемое заимствование перед мутацией" - ); - m.insert("e0502-fix-clone-desc", "Клонировать данные перед мутацией"); - - // E0499 - Cannot borrow as mutable more than once - m.insert( - "e0499-title", - "Нельзя заимствовать как изменяемое больше одного раза" - ); - m.insert( - "e0499-translation", - "нельзя заимствовать как изменяемое больше одного раза одновременно" - ); - m.insert( - "e0499-explanation", - "\ -Rust разрешает только ОДНУ изменяемую ссылку на данные одновременно. -Это строже правила неизменяемого заимствования и предотвращает любую -мутацию через алиасы. - -Почему? Две изменяемые ссылки на одни данные могут привести к: -- Гонкам данных в параллельном коде -- Инвалидации итераторов -- Висячим указателям после реаллокации - -Это правило проверяется на этапе компиляции, давая вам fearless concurrency." - ); - m.insert( - "e0499-fix-scope-desc", - "Использовать области видимости для ограничения времени жизни ссылки" - ); - m.insert( - "e0499-fix-refcell-desc", - "Использовать RefCell для interior mutability (проверки в рантайме)" - ); - - // E0308 - Mismatched types - m.insert("e0308-title", "Несовпадение типов"); - m.insert("e0308-translation", "несовпадение типов"); - m.insert( - "e0308-explanation", - "\ -Rust — статически типизированный язык, который НЕ выполняет неявные -преобразования типов. Каждое значение имеет конкретный тип, и компилятор -обеспечивает согласованность типов. - -Это ловит ошибки на этапе компиляции, которые были бы ошибками времени -выполнения в других языках. Система типов — ваш друг, а не препятствие." - ); - m.insert( - "e0308-fix-convert-desc", - "Использовать parse() для преобразования строки в число" - ); - m.insert( - "e0308-fix-as-desc", - "Использовать 'as' для приведения числовых типов" - ); - - // E0106 - Missing lifetime specifier - m.insert("e0106-title", "Отсутствует спецификатор времени жизни"); - m.insert( - "e0106-translation", - "отсутствует спецификатор времени жизни" - ); - m.insert( - "e0106-explanation", - "\ -Ссылки в Rust имеют времена жизни — они описывают, как долго ссылка валидна. -Обычно компилятор выводит времена жизни сам, но иногда нужно указать явно. - -Аннотации времён жизни не изменяют то, как долго живут значения. Они -описывают связи между ссылками, чтобы компилятор мог проверить безопасность." - ); - m.insert( - "e0106-fix-lifetime-desc", - "Добавить явный параметр времени жизни" - ); - m.insert( - "e0106-fix-owned-desc", - "Использовать владеющий тип вместо ссылки" - ); - - // E0597 - Value does not live long enough - m.insert("e0597-title", "Значение живёт недостаточно долго"); - m.insert("e0597-translation", "значение живёт недостаточно долго"); - m.insert( - "e0597-explanation", - "\ -Вы создаёте ссылку на что-то, что будет уничтожено до того, как ссылка -будет использована. Это создало бы висячий указатель. - -Rust предотвращает это на этапе компиляции. Значение, на которое ссылаются, -должно жить как минимум столько же, сколько сама ссылка." - ); - m.insert( - "e0597-fix-move-desc", - "Переместить значение во внешнюю область видимости" - ); - m.insert( - "e0597-fix-owned-desc", - "Вернуть владеющее значение вместо ссылки" - ); - - m -} - -pub fn translations() -> HashMap<&'static str, &'static str> { - let mut m = HashMap::new(); - - // Error headers - m.insert("error", "ошибка"); - m.insert("warning", "предупреждение"); - m.insert("note", "примечание"); - m.insert("help", "подсказка"); - - // E0382 - borrow of moved value - m.insert( - "borrow of moved value", - "заимствование перемещённого значения" - ); - m.insert("move occurs because", "перемещение происходит потому что"); - m.insert( - "which does not implement the `Copy` trait", - "который не реализует трейт `Copy`" - ); - m.insert("value moved here", "значение перемещено здесь"); - m.insert( - "value borrowed here after move", - "значение заимствовано здесь после перемещения" - ); - m.insert( - "consider cloning the value if the performance cost is acceptable", - "рассмотрите клонирование значения, если допустима потеря производительности" - ); - - // E0502 - cannot borrow as mutable - m.insert("cannot borrow", "нельзя заимствовать"); - m.insert( - "as mutable because it is also borrowed as immutable", - "как изменяемое, т.к. уже заимствовано как неизменяемое" - ); - m.insert( - "immutable borrow occurs here", - "неизменяемое заимствование здесь" - ); - m.insert( - "mutable borrow occurs here", - "изменяемое заимствование здесь" - ); - m.insert( - "immutable borrow later used here", - "неизменяемое заимствование используется здесь" - ); - - // E0499 - cannot borrow as mutable more than once - m.insert( - "as mutable more than once at a time", - "как изменяемое больше одного раза одновременно" - ); - m.insert( - "first mutable borrow occurs here", - "первое изменяемое заимствование здесь" - ); - m.insert( - "second mutable borrow occurs here", - "второе изменяемое заимствование здесь" - ); - m.insert( - "first borrow later used here", - "первое заимствование используется здесь" - ); - - // E0308 - mismatched types - m.insert("mismatched types", "несовпадение типов"); - m.insert("expected", "ожидается"); - m.insert("found", "найдено"); - m.insert("expected type", "ожидаемый тип"); - m.insert("found type", "найденный тип"); - m.insert("this expression has type", "это выражение имеет тип"); - - // E0106 - missing lifetime - m.insert( - "missing lifetime specifier", - "отсутствует спецификатор времени жизни" - ); - m.insert( - "expected named lifetime parameter", - "ожидается именованный параметр времени жизни" - ); - - // E0597 - does not live long enough - m.insert("does not live long enough", "живёт недостаточно долго"); - m.insert( - "borrowed value does not live long enough", - "заимствованное значение живёт недостаточно долго" - ); - m.insert( - "dropped here while still borrowed", - "удалено здесь, пока ещё заимствовано" - ); - - // Common phrases - m.insert("has type", "имеет тип"); - m.insert("consider", "рассмотрите"); - m.insert( - "this error originates in the macro", - "эта ошибка возникла в макросе" - ); - m.insert("run with", "запустите с"); - m.insert( - "for more info about this issue", - "для информации об этой ошибке" - ); - m.insert("aborting due to", "прерывание из-за"); - m.insert("previous error", "предыдущей ошибки"); - m.insert("previous errors", "предыдущих ошибок"); - m.insert("could not compile", "не удалось скомпилировать"); - m.insert("due to", "из-за"); - - m -} diff --git a/masterror-cli/src/main.rs b/masterror-cli/src/main.rs deleted file mode 100644 index 8ff3e07..0000000 --- a/masterror-cli/src/main.rs +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! masterror CLI - Rust compiler error explainer. - -mod commands; -mod errors; -mod locale; -mod options; -mod output; -mod parser; -mod sections; - -use clap::{Parser, Subcommand}; - -use crate::{locale::Locale, options::DisplayOptions}; - -#[derive(Parser)] -#[command(name = "masterror")] -#[command(author, version, about = "Rust compiler error explainer")] -struct Cli { - /// Language for explanations (en, ru, ko) - #[arg(short, long, env = "MASTERROR_LANG", default_value = "en")] - lang: String, - - /// Disable colored output - #[arg(long, env = "NO_COLOR")] - no_color: bool, - - #[command(subcommand)] - command: Commands -} - -#[derive(Subcommand)] -enum Commands { - /// Run cargo check and explain errors - Check { - #[arg(trailing_var_arg = true)] - args: Vec - }, - /// Explain a specific error code (E0382) or best practice (RA001) - Explain { code: String }, - /// List all known error codes - List { - #[arg(short, long)] - category: Option - }, - /// Show RustManifest best practices - Practice { - /// Practice code (RA001-RA015) or empty for list - code: Option, - /// Filter by category - #[arg(short, long)] - category: Option - } -} - -fn main() { - let cli = Cli::parse(); - let locale = Locale::new(&cli.lang); - let opts = DisplayOptions { - colored: !cli.no_color - }; - - let result = match &cli.command { - Commands::Check { - args - } => commands::check(&locale, args, &opts), - Commands::Explain { - code - } => commands::explain(&cli.lang, code, &opts), - Commands::List { - category - } => commands::list(&cli.lang, category.as_deref(), &opts), - Commands::Practice { - code, - category - } => { - if let Some(c) = code { - commands::practice::show(&cli.lang, c, &opts) - } else { - commands::practice::list(&cli.lang, category.as_deref(), &opts) - } - } - }; - - if let Err(e) = result { - eprintln!("Error: {e}"); - std::process::exit(1); - } -} diff --git a/masterror-cli/src/options.rs b/masterror-cli/src/options.rs deleted file mode 100644 index be666d0..0000000 --- a/masterror-cli/src/options.rs +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Display options for masterror output. - -/// What sections to show in masterror block. -#[derive(Clone, Copy)] -pub struct DisplayOptions { - pub colored: bool -} diff --git a/masterror-cli/src/output.rs b/masterror-cli/src/output.rs deleted file mode 100644 index 2f1b057..0000000 --- a/masterror-cli/src/output.rs +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Terminal output formatting for errors. - -use owo_colors::OwoColorize; - -#[allow(unused_imports)] -use crate::sections; -use crate::{ - errors::{ErrorEntry, ErrorRegistry}, - options::DisplayOptions, - parser::CargoMessage -}; - -const SEPARATOR: &str = "--- masterror ----------------------------------------"; -const SEPARATOR_END: &str = "------------------------------------------------------"; - -/// Print error with masterror explanation. -pub fn print_error(lang: &str, msg: &CargoMessage, opts: &DisplayOptions) { - let rendered = msg.rendered_output(); - - #[cfg(feature = "show-original")] - if let Some(r) = rendered { - print!("{}", r.trim_end()); - } - - let Some(code) = msg.error_code() else { - #[cfg(feature = "show-original")] - println!(); - return; - }; - - let registry = ErrorRegistry::new(); - let Some(entry) = registry.find(code) else { - #[cfg(feature = "show-original")] - println!(); - return; - }; - - println!(); - print_block(lang, entry, msg.error_message(), rendered, opts); -} - -fn print_block( - lang: &str, - entry: &ErrorEntry, - #[allow(unused_variables)] error_msg: Option<&str>, - #[allow(unused_variables)] rendered: Option<&str>, - opts: &DisplayOptions -) { - if opts.colored { - println!("{}", SEPARATOR.dimmed()); - } else { - println!("{SEPARATOR}"); - } - - #[cfg(feature = "show-translation")] - sections::translation::print(lang, entry.code, rendered, opts.colored); - - #[cfg(feature = "show-why")] - { - let label = match lang { - "ru" => "Почему это происходит:", - "ko" => "왜 이런 일이 발생하나요:", - _ => "Why this happens:" - }; - if opts.colored { - println!("{}", label.green().bold()); - } else { - println!("{label}"); - } - println!("{}", entry.explanation.get(lang)); - } - - #[cfg(feature = "show-fix")] - sections::fix::print(lang, entry.fixes, opts.colored); - - #[cfg(feature = "show-link")] - sections::link::print(lang, entry.links, opts.colored); - - if opts.colored { - println!("{}", SEPARATOR_END.dimmed()); - } else { - println!("{SEPARATOR_END}"); - } -} diff --git a/masterror-cli/src/parser.rs b/masterror-cli/src/parser.rs deleted file mode 100644 index fac1f9c..0000000 --- a/masterror-cli/src/parser.rs +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Cargo JSON output parser. - -use serde::Deserialize; - -/// Top-level cargo message. -#[derive(Deserialize)] -pub struct CargoMessage { - pub reason: String, - pub message: Option, - /// Full rendered compiler output. - pub rendered: Option -} - -/// Compiler diagnostic message. -#[derive(Deserialize)] -pub struct DiagnosticMessage { - pub level: String, - pub message: String, - pub code: Option, - pub rendered: Option -} - -/// Error code info. -#[derive(Deserialize)] -pub struct DiagnosticCode { - pub code: String -} - -impl CargoMessage { - /// Check if this is a compiler error message. - pub fn is_error(&self) -> bool { - self.reason == "compiler-message" - && self.message.as_ref().is_some_and(|m| m.level == "error") - } - - /// Get the error code if present. - pub fn error_code(&self) -> Option<&str> { - self.message - .as_ref() - .and_then(|m| m.code.as_ref()) - .map(|c| c.code.as_str()) - } - - /// Get the error message. - pub fn error_message(&self) -> Option<&str> { - self.message.as_ref().map(|m| m.message.as_str()) - } - - /// Get rendered output (from message or top-level). - pub fn rendered_output(&self) -> Option<&str> { - self.message - .as_ref() - .and_then(|m| m.rendered.as_deref()) - .or(self.rendered.as_deref()) - } -} diff --git a/masterror-cli/src/sections.rs b/masterror-cli/src/sections.rs deleted file mode 100644 index 1e02b0f..0000000 --- a/masterror-cli/src/sections.rs +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Output sections for masterror block. - -pub mod fix; -pub mod link; -pub mod translation; -pub mod why; diff --git a/masterror-cli/src/sections/fix.rs b/masterror-cli/src/sections/fix.rs deleted file mode 100644 index 0d6d103..0000000 --- a/masterror-cli/src/sections/fix.rs +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Fix section - shows fix suggestions with code examples. -#![allow(dead_code)] - -use owo_colors::OwoColorize; - -use crate::errors::FixSuggestion; - -/// Print fix suggestions with code examples. -pub fn print(lang: &str, fixes: &[FixSuggestion], colored: bool) { - if fixes.is_empty() { - return; - } - - let label = match lang { - "ru" => "Как исправить:", - "ko" => "해결 방법:", - _ => "How to fix:" - }; - - if colored { - println!("{}", label.green().bold()); - } else { - println!("{label}"); - } - - for (i, fix) in fixes.iter().enumerate() { - let desc = fix.description.get(lang); - if colored { - println!(" {}. {}", (i + 1).to_string().cyan(), desc); - println!(" {}", fix.code.dimmed()); - } else { - println!(" {}. {}", i + 1, desc); - println!(" {}", fix.code); - } - } -} diff --git a/masterror-cli/src/sections/link.rs b/masterror-cli/src/sections/link.rs deleted file mode 100644 index dd719ea..0000000 --- a/masterror-cli/src/sections/link.rs +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Link section - shows documentation URLs. -#![allow(dead_code)] - -use owo_colors::OwoColorize; - -use crate::errors::DocLink; - -/// Print documentation links with titles. -pub fn print(lang: &str, links: &[DocLink], colored: bool) { - if links.is_empty() { - return; - } - - let label = match lang { - "ru" => "Ссылки:", - "ko" => "링크:", - _ => "Links:" - }; - - if colored { - println!("{}", label.blue().bold()); - } else { - println!("{label}"); - } - - for link in links { - if colored { - println!(" {} {}", link.title.cyan(), link.url.underline().dimmed()); - } else { - println!(" {} {}", link.title, link.url); - } - } -} diff --git a/masterror-cli/src/sections/translation.rs b/masterror-cli/src/sections/translation.rs deleted file mode 100644 index c131f75..0000000 --- a/masterror-cli/src/sections/translation.rs +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Translation section - shows full translated compiler error. -#![allow(dead_code)] - -use owo_colors::OwoColorize; - -use crate::locale::Locale; - -/// Print full translated copy of compiler error. -pub fn print(lang: &str, _error_code: &str, rendered: Option<&str>, colored: bool) { - // Only show translation for non-English languages - if lang == "en" { - return; - } - - let Some(rendered) = rendered else { - return; - }; - - // Create locale to use its translation capability - let locale = Locale::new(lang); - if !locale.has_translation() { - return; - } - - let translated = locale.translate_rendered(rendered); - - let label = match lang { - "ru" => "Перевод:", - "ko" => "번역:", - _ => "Translation:" - }; - - if colored { - println!("{}", label.cyan().bold()); - } else { - println!("{label}"); - } - - for line in translated.lines() { - println!(" {line}"); - } -} diff --git a/masterror-cli/src/sections/why.rs b/masterror-cli/src/sections/why.rs deleted file mode 100644 index ae64595..0000000 --- a/masterror-cli/src/sections/why.rs +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Why section - explains the error cause in detail. -#![allow(dead_code)] - -use owo_colors::OwoColorize; - -/// Print detailed explanation of the error. -pub fn print(lang: &str, explanation: &str, colored: bool) { - let label = match lang { - "ru" => "Почему это происходит:", - "ko" => "왜 이런 일이 발생하나요:", - _ => "Why this happens:" - }; - - if colored { - println!("{}", label.yellow().bold()); - } else { - println!("{label}"); - } - - for line in explanation.lines() { - println!(" {line}"); - } -} From b32d2f53f86e8e5ca0bfeae363565f666e77de30 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 11:41:55 +0700 Subject: [PATCH 09/16] feat: add masterror-knowledge and masterror-cli to workspace - masterror-knowledge: compiler error explanations database - 31 rustc errors (E0xxx) with translations (en/ru/ko) - 15 best practices (RA001-RA015) - i18n system with zero-allocation static strings - masterror-cli: cargo subcommand for error explanations - `cargo masterror check` - check with explanations - `masterror explain E0502` - explain specific error - `masterror init` - interactive setup with first-run detection - Layered config: CLI args > env > .masterror.toml > global - Feature `knowledge` in masterror re-exports the knowledge crate --- Cargo.lock | 314 +++++++++++++++++- Cargo.toml | 8 + README.md | 2 +- REUSE.toml | 5 + masterror-cli/Cargo.toml | 55 +++ masterror-cli/src/commands/check.rs | 126 +++++++ masterror-cli/src/commands/explain.rs | 174 ++++++++++ masterror-cli/src/commands/init.rs | 295 ++++++++++++++++ masterror-cli/src/commands/list.rs | 89 +++++ masterror-cli/src/commands/mod.rs | 16 + masterror-cli/src/commands/practice.rs | 106 ++++++ masterror-cli/src/config.rs | 203 +++++++++++ masterror-cli/src/error.rs | 169 ++++++++++ masterror-cli/src/main.rs | 131 ++++++++ masterror-cli/src/options.rs | 138 ++++++++ masterror-cli/src/output.rs | 78 +++++ masterror-cli/src/parser.rs | 62 ++++ masterror-cli/src/sections/fix.rs | 35 ++ masterror-cli/src/sections/link.rs | 31 ++ masterror-cli/src/sections/mod.rs | 9 + masterror-cli/src/sections/translation.rs | 33 ++ masterror-knowledge/Cargo.toml | 25 ++ masterror-knowledge/src/errors/borrowing.rs | 31 ++ .../src/errors/borrowing/e0499.rs | 68 ++++ .../src/errors/borrowing/e0500.rs | 50 +++ .../src/errors/borrowing/e0501.rs | 41 +++ .../src/errors/borrowing/e0502.rs | 63 ++++ .../src/errors/borrowing/e0503.rs | 42 +++ .../src/errors/borrowing/e0506.rs | 40 +++ .../src/errors/borrowing/e0508.rs | 50 +++ .../src/errors/borrowing/e0596.rs | 51 +++ masterror-knowledge/src/errors/lifetimes.rs | 31 ++ .../src/errors/lifetimes/e0106.rs | 68 ++++ .../src/errors/lifetimes/e0495.rs | 38 +++ .../src/errors/lifetimes/e0515.rs | 51 +++ .../src/errors/lifetimes/e0597.rs | 57 ++++ .../src/errors/lifetimes/e0621.rs | 38 +++ .../src/errors/lifetimes/e0623.rs | 37 +++ .../src/errors/lifetimes/e0700.rs | 39 +++ .../src/errors/lifetimes/e0716.rs | 40 +++ masterror-knowledge/src/errors/mod.rs | 213 ++++++++++++ masterror-knowledge/src/errors/ownership.rs | 29 ++ .../src/errors/ownership/e0381.rs | 55 +++ .../src/errors/ownership/e0382.rs | 80 +++++ .../src/errors/ownership/e0383.rs | 46 +++ .../src/errors/ownership/e0384.rs | 62 ++++ .../src/errors/ownership/e0505.rs | 56 ++++ .../src/errors/ownership/e0507.rs | 71 ++++ .../src/errors/ownership/e0509.rs | 52 +++ masterror-knowledge/src/errors/raprogramm.rs | 175 ++++++++++ .../src/errors/raprogramm/ra001.rs | 39 +++ .../src/errors/raprogramm/ra002.rs | 34 ++ .../src/errors/raprogramm/ra003.rs | 39 +++ .../src/errors/raprogramm/ra004.rs | 40 +++ .../src/errors/raprogramm/ra005.rs | 48 +++ .../src/errors/raprogramm/ra006.rs | 46 +++ .../src/errors/raprogramm/ra007.rs | 44 +++ .../src/errors/raprogramm/ra008.rs | 50 +++ .../src/errors/raprogramm/ra009.rs | 58 ++++ .../src/errors/raprogramm/ra010.rs | 56 ++++ .../src/errors/raprogramm/ra011.rs | 44 +++ .../src/errors/raprogramm/ra012.rs | 49 +++ .../src/errors/raprogramm/ra013.rs | 61 ++++ .../src/errors/raprogramm/ra014.rs | 38 +++ .../src/errors/raprogramm/ra015.rs | 43 +++ masterror-knowledge/src/errors/resolution.rs | 17 + .../src/errors/resolution/e0412.rs | 28 ++ .../src/errors/resolution/e0425.rs | 32 ++ .../src/errors/resolution/e0433.rs | 38 +++ masterror-knowledge/src/errors/traits.rs | 16 + .../src/errors/traits/e0038.rs | 28 ++ .../src/errors/traits/e0282.rs | 32 ++ masterror-knowledge/src/errors/types.rs | 17 + masterror-knowledge/src/errors/types/e0277.rs | 42 +++ masterror-knowledge/src/errors/types/e0308.rs | 30 ++ masterror-knowledge/src/errors/types/e0599.rs | 32 ++ masterror-knowledge/src/i18n/messages.rs | 206 ++++++++++++ masterror-knowledge/src/i18n/mod.rs | 152 +++++++++ masterror-knowledge/src/i18n/phrases.rs | 241 ++++++++++++++ masterror-knowledge/src/lib.rs | 34 ++ src/lib.rs | 8 + 81 files changed, 5414 insertions(+), 6 deletions(-) create mode 100644 masterror-cli/Cargo.toml create mode 100644 masterror-cli/src/commands/check.rs create mode 100644 masterror-cli/src/commands/explain.rs create mode 100644 masterror-cli/src/commands/init.rs create mode 100644 masterror-cli/src/commands/list.rs create mode 100644 masterror-cli/src/commands/mod.rs create mode 100644 masterror-cli/src/commands/practice.rs create mode 100644 masterror-cli/src/config.rs create mode 100644 masterror-cli/src/error.rs create mode 100644 masterror-cli/src/main.rs create mode 100644 masterror-cli/src/options.rs create mode 100644 masterror-cli/src/output.rs create mode 100644 masterror-cli/src/parser.rs create mode 100644 masterror-cli/src/sections/fix.rs create mode 100644 masterror-cli/src/sections/link.rs create mode 100644 masterror-cli/src/sections/mod.rs create mode 100644 masterror-cli/src/sections/translation.rs create mode 100644 masterror-knowledge/Cargo.toml create mode 100644 masterror-knowledge/src/errors/borrowing.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0499.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0500.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0501.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0502.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0503.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0506.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0508.rs create mode 100644 masterror-knowledge/src/errors/borrowing/e0596.rs create mode 100644 masterror-knowledge/src/errors/lifetimes.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0106.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0495.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0515.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0597.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0621.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0623.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0700.rs create mode 100644 masterror-knowledge/src/errors/lifetimes/e0716.rs create mode 100644 masterror-knowledge/src/errors/mod.rs create mode 100644 masterror-knowledge/src/errors/ownership.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0381.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0382.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0383.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0384.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0505.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0507.rs create mode 100644 masterror-knowledge/src/errors/ownership/e0509.rs create mode 100644 masterror-knowledge/src/errors/raprogramm.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra001.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra002.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra003.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra004.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra005.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra006.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra007.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra008.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra009.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra010.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra011.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra012.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra013.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra014.rs create mode 100644 masterror-knowledge/src/errors/raprogramm/ra015.rs create mode 100644 masterror-knowledge/src/errors/resolution.rs create mode 100644 masterror-knowledge/src/errors/resolution/e0412.rs create mode 100644 masterror-knowledge/src/errors/resolution/e0425.rs create mode 100644 masterror-knowledge/src/errors/resolution/e0433.rs create mode 100644 masterror-knowledge/src/errors/traits.rs create mode 100644 masterror-knowledge/src/errors/traits/e0038.rs create mode 100644 masterror-knowledge/src/errors/traits/e0282.rs create mode 100644 masterror-knowledge/src/errors/types.rs create mode 100644 masterror-knowledge/src/errors/types/e0277.rs create mode 100644 masterror-knowledge/src/errors/types/e0308.rs create mode 100644 masterror-knowledge/src/errors/types/e0599.rs create mode 100644 masterror-knowledge/src/i18n/messages.rs create mode 100644 masterror-knowledge/src/i18n/mod.rs create mode 100644 masterror-knowledge/src/i18n/phrases.rs create mode 100644 masterror-knowledge/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index a97000b..1292c1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,12 +225,56 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.100" @@ -258,6 +302,27 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "assert_cmd" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c5bcfa8749ac45dd12cb11055aeeb6b27a3895560d60d71e3c23bf979e60514" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "async-trait" version = "0.1.89" @@ -435,6 +500,17 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.19.1" @@ -544,6 +620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] @@ -552,8 +629,23 @@ version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ + "anstream", "anstyle", "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -562,6 +654,12 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "combine" version = "4.6.7" @@ -596,7 +694,7 @@ dependencies = [ "serde-untagged", "serde_core", "serde_json", - "toml", + "toml 0.9.11+spec-1.1.0", "winnow", "yaml-rust2", ] @@ -972,6 +1070,12 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.10.7" @@ -996,6 +1100,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1185,6 +1310,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "flume" version = "0.11.1" @@ -1838,6 +1972,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itertools" version = "0.13.0" @@ -1978,6 +2118,7 @@ dependencies = [ "log", "log-mdc", "masterror-derive", + "masterror-knowledge", "masterror-template", "metrics", "owo-colors", @@ -1994,7 +2135,7 @@ dependencies = [ "tempfile", "thiserror", "tokio", - "toml", + "toml 0.9.11+spec-1.1.0", "tonic", "tracing", "tracing-subscriber", @@ -2005,6 +2146,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "masterror-cli" +version = "0.1.0" +dependencies = [ + "assert_cmd", + "clap", + "dirs", + "masterror-knowledge", + "owo-colors", + "predicates", + "serde", + "serde_json", + "toml 0.8.23", +] + [[package]] name = "masterror-derive" version = "0.11.2" @@ -2015,6 +2171,14 @@ dependencies = [ "syn", ] +[[package]] +name = "masterror-knowledge" +version = "0.1.0" +dependencies = [ + "aho-corasick", + "arrayvec", +] + [[package]] name = "masterror-template" version = "0.4.1" @@ -2122,6 +2286,12 @@ dependencies = [ "tempfile", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2242,6 +2412,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "oorandom" version = "11.1.5" @@ -2292,6 +2468,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-multimap" version = "0.7.3" @@ -2532,6 +2714,36 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -2720,6 +2932,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror", +] + [[package]] name = "ref-cast" version = "1.0.25" @@ -3076,6 +3299,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_spanned" version = "1.0.4" @@ -3612,6 +3844,22 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "thiserror" version = "2.0.18" @@ -3768,6 +4016,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + [[package]] name = "toml" version = "0.9.11+spec-1.1.0" @@ -3776,13 +4036,22 @@ checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ "indexmap 2.13.0", "serde_core", - "serde_spanned", - "toml_datetime", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", "winnow", ] +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -3792,6 +4061,20 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + [[package]] name = "toml_parser" version = "1.0.6+spec-1.1.0" @@ -3801,6 +4084,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "toml_writer" version = "1.0.6+spec-1.1.0" @@ -3965,7 +4254,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml", + "toml 0.9.11+spec-1.1.0", ] [[package]] @@ -4074,6 +4363,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "utoipa" version = "5.4.0" @@ -4157,6 +4452,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 3b7d835..e0f6bd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,8 @@ include = [ members = [ "masterror-derive", "masterror-template", + "masterror-knowledge", + "masterror-cli", "examples/axum-rest-api", "examples/custom-domain-errors", "examples/sqlx-database", @@ -87,6 +89,7 @@ turnkey = ["std"] tonic = ["dep:tonic", "std"] openapi = ["dep:utoipa", "std"] benchmarks = ["std"] +knowledge = ["dep:masterror-knowledge"] [workspace.dependencies] masterror-derive = { version = "0.11" } @@ -147,6 +150,7 @@ tonic = { version = "0.14", optional = true } owo-colors = { version = "4", optional = true, default-features = false, features = [ "supports-colors", ] } +masterror-knowledge = { path = "masterror-knowledge", optional = true } [dev-dependencies] anyhow = { version = "1", default-features = false, features = ["std"] } @@ -200,6 +204,7 @@ feature_order = [ "tonic", "frontend", "turnkey", + "knowledge", "benchmarks", ] feature_snippet_group = 4 @@ -283,6 +288,9 @@ description = "Log to the browser console and convert to JsValue on WASM" [package.metadata.masterror.readme.features.turnkey] description = "Ship Turnkey-specific error taxonomy and conversions" +[package.metadata.masterror.readme.features.knowledge] +description = "Rust compiler error explanations and best practices (en/ru/ko)" + [package.metadata.masterror.readme.features.benchmarks] description = "Enable Criterion benchmarks and CI baseline tooling" extra = ["Primarily used for local profiling and continuous benchmarking runs"] diff --git a/README.md b/README.md index 0169777..97c2057 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ masterror = { version = "0.27.2", default-features = false } # "colored", "sqlx", "sqlx-migrate", "reqwest", # "redis", "validator", "config", "tokio", # "multipart", "teloxide", "init-data", "tonic", -# "frontend", "turnkey", "benchmarks" +# "frontend", "turnkey", "knowledge", "benchmarks" # ] } ~~~ diff --git a/REUSE.toml b/REUSE.toml index ee0adcb..95691c8 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -8,3 +8,8 @@ version = 1 path = ["**/Cargo.lock", "pkg/aur/.SRCINFO", "**/.cargo/config.toml"] SPDX-FileCopyrightText = "2025-2026 RAprogramm " SPDX-License-Identifier = "MIT" + +[[annotations]] +path = ["masterror-knowledge/src/errors/ownership/e0382.rs", "masterror-knowledge/src/errors/ownership/e0384.rs"] +SPDX-FileCopyrightText = "2025-2026 RAprogramm " +SPDX-License-Identifier = "MIT" diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml new file mode 100644 index 0000000..89b54b4 --- /dev/null +++ b/masterror-cli/Cargo.toml @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +[package] +name = "masterror-cli" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +description = "CLI tool for explaining Rust compiler errors in human-friendly language" +keywords = ["rust", "compiler", "errors", "explain", "cli"] +categories = ["command-line-utilities", "development-tools"] + +[[bin]] +name = "masterror" +path = "src/main.rs" + +[[bin]] +name = "cargo-masterror" +path = "src/main.rs" + +[features] +default = ["show-why", "show-fix", "show-link", "show-translation"] + +# Display sections +show-why = [] +show-fix = [] +show-link = [] +show-translation = [] + +# Show original compiler output before masterror block +show-original = [] + +[dependencies] +masterror-knowledge = { path = "../masterror-knowledge" } + +# CLI framework +clap = { version = "4", features = ["derive", "env", "wrap_help"] } + +# Colored output +owo-colors = { version = "4", features = ["supports-colors"] } + +# Serialization +serde = { version = "1", features = ["derive"] } +serde_json = "1" +toml = "0.8" + +# Config paths +dirs = "6" + +[dev-dependencies] +assert_cmd = "2" +predicates = "3" diff --git a/masterror-cli/src/commands/check.rs b/masterror-cli/src/commands/check.rs new file mode 100644 index 0000000..d84bbb3 --- /dev/null +++ b/masterror-cli/src/commands/check.rs @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Check command - run cargo check and explain errors. + +use std::{ + io::{BufRead, BufReader}, + process::{Command, Stdio} +}; + +use masterror_knowledge::Lang; + +use crate::{ + error::{AppError, Result}, + options::DisplayOptions, + output, + parser::CargoMessage +}; + +/// Allowed cargo arguments whitelist. +const ALLOWED_ARGS: &[&str] = &[ + "--release", + "--all-targets", + "--all-features", + "--no-default-features", + "-p", + "--package", + "--workspace", + "--lib", + "--bins", + "--bin", + "--examples", + "--example", + "--tests", + "--test", + "--benches", + "--bench", + "--features", + "-F", + "--target", + "--profile", + "-j", + "--jobs", + "-v", + "--verbose", + "-q", + "--quiet", + "--locked", + "--frozen", + "--offline" +]; + +/// Validate cargo arguments against whitelist. +fn validate_args(args: &[String]) -> Result<()> { + for arg in args { + if arg.starts_with('-') { + let is_allowed = ALLOWED_ARGS + .iter() + .any(|allowed| arg == *allowed || arg.starts_with(&format!("{allowed}="))); + if !is_allowed { + return Err(AppError::InvalidArgument { + arg: arg.clone() + }); + } + } + } + Ok(()) +} + +/// Run cargo check and explain errors. +pub fn run(lang: Lang, args: &[String], opts: &DisplayOptions) -> Result<()> { + validate_args(args)?; + + let msg_format = if opts.colored { + "--message-format=json-diagnostic-rendered-ansi" + } else { + "--message-format=json" + }; + + let mut cmd = Command::new("cargo") + .arg("check") + .arg(msg_format) + .args(args) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn()?; + + let stdout = cmd + .stdout + .take() + .ok_or_else(|| AppError::Io(std::io::Error::other("failed to capture stdout")))?; + let reader = BufReader::new(stdout); + + let mut error_count = 0; + + for line in reader.lines() { + let line = line?; + if let Ok(msg) = serde_json::from_str::(&line) + && msg.is_error() + { + error_count += 1; + output::print_error(lang, &msg, opts); + println!(); + } + } + + let status = cmd.wait()?; + + if error_count > 0 { + println!("Found {error_count} error(s). Run `masterror explain ` for details."); + } + + if !status.success() { + match status.code() { + Some(code) => { + return Err(AppError::CargoFailed { + code + }); + } + None => return Err(AppError::CargoSignaled) + } + } + + Ok(()) +} diff --git a/masterror-cli/src/commands/explain.rs b/masterror-cli/src/commands/explain.rs new file mode 100644 index 0000000..0a6dcf7 --- /dev/null +++ b/masterror-cli/src/commands/explain.rs @@ -0,0 +1,174 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Explain command - explain a specific error code or best practice. + +use masterror_knowledge::{ + BestPractice, ErrorEntry, ErrorRegistry, Lang, PracticeRegistry, UiMsg +}; +use owo_colors::OwoColorize; + +use crate::{ + error::{AppError, Result}, + options::DisplayOptions +}; + +/// Explain a specific error code (E0382) or best practice (RA001). +pub fn run(lang: Lang, code: &str, opts: &DisplayOptions) -> Result<()> { + let upper = code.to_uppercase(); + + if upper.starts_with("RA") { + let registry = PracticeRegistry::new(); + if let Some(practice) = registry.find(&upper) { + print_practice(lang, practice, opts); + return Ok(()); + } + } + + let registry = ErrorRegistry::new(); + if let Some(entry) = registry.find(code) { + print_error(lang, entry, opts); + return Ok(()); + } + + Err(AppError::UnknownErrorCode { + code: code.to_string() + }) +} + +fn print_error(lang: Lang, entry: &ErrorEntry, opts: &DisplayOptions) { + println!(); + + let title = entry.title.get(lang.code()); + if opts.colored { + println!("{} - {}", entry.code.yellow().bold(), title.bold()); + } else { + println!("{} - {title}", entry.code); + } + + let category = entry.category.name(lang.code()); + if opts.colored { + println!("{}: {}", UiMsg::Category.get(lang), category.dimmed()); + } else { + println!("{}: {category}", UiMsg::Category.get(lang)); + } + + println!(); + let why_label = UiMsg::LabelWhy.get(lang); + if opts.colored { + println!("{}", why_label.green().bold()); + } else { + println!("{why_label}"); + } + println!("{}", entry.explanation.get(lang.code())); + + if !entry.fixes.is_empty() { + println!(); + let fix_label = UiMsg::LabelFix.get(lang); + if opts.colored { + println!("{}", fix_label.green().bold()); + } else { + println!("{fix_label}"); + } + for (i, fix) in entry.fixes.iter().enumerate() { + println!(); + println!("{}. {}", i + 1, fix.description.get(lang.code())); + println!("```rust"); + println!("{}", fix.code); + println!("```"); + } + } + + if !entry.links.is_empty() { + println!(); + let link_label = UiMsg::LabelLink.get(lang); + if opts.colored { + println!("{}", link_label.cyan().bold()); + } else { + println!("{link_label}"); + } + for link in entry.links { + if opts.colored { + println!(" - {} {}", link.title, link.url.dimmed()); + } else { + println!(" - {} {}", link.title, link.url); + } + } + } + + println!(); +} + +/// Print best practice details. +pub fn print_practice(lang: Lang, practice: &BestPractice, opts: &DisplayOptions) { + println!(); + + let title = practice.title.get(lang.code()); + if opts.colored { + println!("{} - {}", practice.code.yellow().bold(), title.bold()); + } else { + println!("{} - {title}", practice.code); + } + + let category = practice.category.name(lang.code()); + if opts.colored { + println!("{}: {}", UiMsg::Category.get(lang), category.dimmed()); + } else { + println!("{}: {category}", UiMsg::Category.get(lang)); + } + + println!(); + let why_label = UiMsg::LabelWhyMatters.get(lang); + if opts.colored { + println!("{}", why_label.green().bold()); + } else { + println!("{why_label}"); + } + println!("{}", practice.explanation.get(lang.code())); + + println!(); + let how_label = UiMsg::LabelHowToApply.get(lang); + if opts.colored { + println!("{}", how_label.green().bold()); + } else { + println!("{how_label}"); + } + + println!(); + let avoid_label = UiMsg::LabelAvoid.get(lang); + if opts.colored { + println!("{}. {}", "1".cyan(), avoid_label.red()); + } else { + println!("1. {avoid_label}"); + } + println!("```rust"); + println!("{}", practice.bad_example); + println!("```"); + + println!(); + let prefer_label = UiMsg::LabelPrefer.get(lang); + if opts.colored { + println!("{}. {}", "2".cyan(), prefer_label.green()); + } else { + println!("2. {prefer_label}"); + } + println!("```rust"); + println!("{}", practice.good_example); + println!("```"); + + println!(); + let link_label = UiMsg::LabelLink.get(lang); + if opts.colored { + println!("{}", link_label.cyan().bold()); + } else { + println!("{link_label}"); + } + if opts.colored { + println!(" - RustManifest {}", practice.source.dimmed()); + } else { + println!(" - RustManifest {}", practice.source); + } + + println!(); +} diff --git a/masterror-cli/src/commands/init.rs b/masterror-cli/src/commands/init.rs new file mode 100644 index 0000000..59d9d0e --- /dev/null +++ b/masterror-cli/src/commands/init.rs @@ -0,0 +1,295 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Init command - create configuration file interactively. + +use std::io::{self, Write}; + +use masterror_knowledge::{Lang, UiMsg}; +use owo_colors::OwoColorize; + +use crate::{ + config::{Config, DisplayConfig, GeneralConfig}, + error::Result +}; + +/// Run init command - create configuration interactively. +pub fn run(_lang: Lang, colored: bool) -> Result<()> { + println!(); + print_welcome(colored); + println!(); + + // First ask language - this affects all subsequent prompts + let lang_value = prompt_language(colored)?; + let lang = masterror_knowledge::Lang::from_code(&lang_value); + + let color_value = prompt_colors(lang, colored)?; + let display = prompt_display(lang, colored)?; + let save_location = prompt_save_location(lang, colored)?; + + let config = Config { + general: GeneralConfig { + lang: lang_value, + colored: color_value + }, + display, + aliases: default_aliases() + }; + + let saved_path = match save_location { + SaveLocation::Global => { + config.save()?; + Config::path() + .map(|p| p.display().to_string()) + .unwrap_or_else(|| "~/.config/masterror/config.toml".to_string()) + } + SaveLocation::Local => { + let path = config.save_local()?; + path.display().to_string() + } + }; + + println!(); + print_success(lang, colored, &saved_path); + print_tips(lang, colored, &save_location); + + Ok(()) +} + +/// Check if first run and prompt for setup. +pub fn check_first_run(colored: bool) -> Result { + if !Config::is_first_run() { + return Ok(false); + } + + println!(); + if colored { + println!( + "{}", + "Welcome to masterror! Let's set up your preferences.".cyan() + ); + println!( + "{}", + "(This only happens once. Run `masterror init` to reconfigure later.)".dimmed() + ); + } else { + println!("Welcome to masterror! Let's set up your preferences."); + println!("(This only happens once. Run `masterror init` to reconfigure later.)"); + } + println!(); + + run(Lang::En, colored)?; + Ok(true) +} + +#[derive(Clone, Copy)] +enum SaveLocation { + Global, + Local +} + +fn print_welcome(colored: bool) { + let title = "masterror - Rust compiler error explainer"; + let subtitle = "Let's configure your preferences"; + + if colored { + println!("{}", title.bold().cyan()); + println!("{}", subtitle.dimmed()); + } else { + println!("{title}"); + println!("{subtitle}"); + } +} + +fn prompt_language(colored: bool) -> Result { + println!(); + if colored { + println!( + "{}", + "Select your language / Выберите язык / 언어 선택".bold() + ); + println!(" {} - English", "en".cyan()); + println!(" {} - Русский", "ru".cyan()); + println!(" {} - 한국어", "ko".cyan()); + } else { + println!("Select your language / Выберите язык / 언어 선택"); + println!(" en - English"); + println!(" ru - Русский"); + println!(" ko - 한국어"); + } + + if colored { + print!("{} [en/ru/ko] ({}): ", "Choice".bold(), "en".dimmed()); + } else { + print!("Choice [en/ru/ko] (en): "); + } + io::stdout().flush()?; + + let mut input = String::new(); + io::stdin().read_line(&mut input)?; + let choice = input.trim().to_lowercase(); + + Ok( + if choice.is_empty() || !["en", "ru", "ko"].contains(&choice.as_str()) { + "en".to_string() + } else { + choice + } + ) +} + +fn prompt_colors(lang: Lang, colored: bool) -> Result { + let prompt = UiMsg::InitColorPrompt.get(lang); + + if colored { + print!("{} [y/n] ({}): ", prompt.bold(), "y".dimmed()); + } else { + print!("{prompt} [y/n] (y): "); + } + io::stdout().flush()?; + + let mut input = String::new(); + io::stdin().read_line(&mut input)?; + Ok(!matches!(input.trim().to_lowercase().as_str(), "n" | "no")) +} + +fn prompt_display(lang: Lang, colored: bool) -> Result { + let prompt = UiMsg::InitDisplayPrompt.get(lang); + println!(); + if colored { + println!("{}", prompt.bold()); + } else { + println!("{prompt}"); + } + + let translation = prompt_bool(lang, colored, UiMsg::InitShowTranslation, true)?; + let why = prompt_bool(lang, colored, UiMsg::InitShowWhy, true)?; + let fix = prompt_bool(lang, colored, UiMsg::InitShowFix, true)?; + let links = prompt_bool(lang, colored, UiMsg::InitShowLinks, true)?; + let original = prompt_bool(lang, colored, UiMsg::InitShowOriginal, false)?; + + Ok(DisplayConfig { + translation, + why, + fix, + links, + original + }) +} + +fn prompt_save_location(lang: Lang, colored: bool) -> Result { + println!(); + let global_label = UiMsg::InitSaveGlobal.get(lang); + let local_label = UiMsg::InitSaveLocal.get(lang); + + if colored { + println!("{}", UiMsg::InitSavePrompt.get(lang).bold()); + println!(" {} - {}", "1".cyan(), global_label); + println!(" {} - {}", "2".cyan(), local_label); + } else { + println!("{}", UiMsg::InitSavePrompt.get(lang)); + println!(" 1 - {global_label}"); + println!(" 2 - {local_label}"); + } + + if colored { + print!("{} [1/2] ({}): ", "Choice".bold(), "1".dimmed()); + } else { + print!("Choice [1/2] (1): "); + } + io::stdout().flush()?; + + let mut input = String::new(); + io::stdin().read_line(&mut input)?; + + Ok(match input.trim() { + "2" => SaveLocation::Local, + _ => SaveLocation::Global + }) +} + +fn prompt_bool(lang: Lang, colored: bool, msg: UiMsg, default: bool) -> Result { + let label = msg.get(lang); + let default_str = if default { "y" } else { "n" }; + + if colored { + print!(" {} [y/n] ({}): ", label, default_str.dimmed()); + } else { + print!(" {label} [y/n] ({default_str}): "); + } + io::stdout().flush()?; + + let mut input = String::new(); + io::stdin().read_line(&mut input)?; + let trimmed = input.trim().to_lowercase(); + + Ok(if trimmed.is_empty() { + default + } else { + matches!(trimmed.as_str(), "y" | "yes" | "д" | "да") + }) +} + +fn print_success(lang: Lang, colored: bool, path: &str) { + let msg = UiMsg::InitSuccess.get(lang); + + if colored { + println!("{} {}", msg.green(), path.dimmed()); + } else { + println!("{msg} {path}"); + } +} + +fn print_tips(lang: Lang, colored: bool, location: &SaveLocation) { + println!(); + let tip = UiMsg::InitTip.get(lang); + + if colored { + println!("{}", tip.dimmed()); + } else { + println!("{tip}"); + } + + match location { + SaveLocation::Global => { + let global_path = Config::path() + .map(|p| p.display().to_string()) + .unwrap_or_else(|| "~/.config/masterror/config.toml".to_string()); + if colored { + println!(" {} {}", "Global:".dimmed(), global_path.dimmed()); + } else { + println!(" Global: {global_path}"); + } + } + SaveLocation::Local => { + if colored { + println!(" {} .masterror.toml", "Local:".dimmed()); + } else { + println!(" Local: .masterror.toml"); + } + } + } + + println!(); + let usage = UiMsg::InitUsage.get(lang); + if colored { + println!("{}", usage.cyan()); + println!(" {} cargo masterror check", "$".dimmed()); + println!(" {} masterror explain E0382", "$".dimmed()); + } else { + println!("{usage}"); + println!(" $ cargo masterror check"); + println!(" $ masterror explain E0382"); + } + println!(); +} + +fn default_aliases() -> std::collections::HashMap { + let mut aliases = std::collections::HashMap::new(); + aliases.insert("c".to_string(), "check".to_string()); + aliases.insert("e".to_string(), "explain".to_string()); + aliases.insert("l".to_string(), "list".to_string()); + aliases.insert("p".to_string(), "practice".to_string()); + aliases +} diff --git a/masterror-cli/src/commands/list.rs b/masterror-cli/src/commands/list.rs new file mode 100644 index 0000000..6c4436e --- /dev/null +++ b/masterror-cli/src/commands/list.rs @@ -0,0 +1,89 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! List command - list all known error codes. + +use masterror_knowledge::{Category, ErrorRegistry, Lang}; +use owo_colors::OwoColorize; + +use crate::{ + error::{AppError, Result}, + options::DisplayOptions +}; + +/// List all known error codes. +pub fn run(lang: Lang, category: Option<&str>, opts: &DisplayOptions) -> Result<()> { + let registry = ErrorRegistry::new(); + + println!(); + if opts.colored { + println!("{}", "Known Rust Compiler Errors".bold()); + } else { + println!("Known Rust Compiler Errors"); + } + println!(); + + let mut entries: Vec<_> = if let Some(cat) = category { + let cat = parse_category(cat); + if let Some(c) = cat { + registry.by_category(c) + } else { + return Err(AppError::InvalidCategory { + name: category.unwrap_or("").to_string() + }); + } + } else { + registry.all().collect() + }; + + if entries.is_empty() { + println!(" No errors found."); + return Ok(()); + } + + entries.sort_by_key(|e| e.code); + + let mut current_cat: Option = None; + for entry in &entries { + if current_cat != Some(entry.category) { + current_cat = Some(entry.category); + println!(); + let cat_name = entry.category.name(lang.code()); + if opts.colored { + println!(" {}", cat_name.yellow().bold()); + } else { + println!(" {cat_name}"); + } + println!(); + } + + let title = entry.title.get(lang.code()); + if opts.colored { + println!(" {} - {title}", entry.code.cyan()); + } else { + println!(" {} - {title}", entry.code); + } + } + + println!(); + println!("Total: {} errors", entries.len()); + println!(); + println!("Use `masterror explain ` to see details."); + println!("Use `masterror practice` to see best practices."); + println!(); + + Ok(()) +} + +fn parse_category(s: &str) -> Option { + match s.to_lowercase().as_str() { + "ownership" | "own" => Some(Category::Ownership), + "borrowing" | "borrow" => Some(Category::Borrowing), + "lifetimes" | "lifetime" | "life" => Some(Category::Lifetimes), + "types" | "type" => Some(Category::Types), + "traits" | "trait" => Some(Category::Traits), + "resolution" | "resolve" | "names" => Some(Category::Resolution), + _ => None + } +} diff --git a/masterror-cli/src/commands/mod.rs b/masterror-cli/src/commands/mod.rs new file mode 100644 index 0000000..7f2c260 --- /dev/null +++ b/masterror-cli/src/commands/mod.rs @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! CLI commands. + +mod check; +mod explain; +pub mod init; +mod list; +pub mod practice; + +pub use check::run as check; +pub use explain::run as explain; +pub use init::run as init; +pub use list::run as list; diff --git a/masterror-cli/src/commands/practice.rs b/masterror-cli/src/commands/practice.rs new file mode 100644 index 0000000..e3ed893 --- /dev/null +++ b/masterror-cli/src/commands/practice.rs @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Practice command - show best practices from RustManifest. + +use masterror_knowledge::{Lang, PracticeCategory, PracticeRegistry}; +use owo_colors::OwoColorize; + +use super::explain::print_practice; +use crate::{ + error::{AppError, Result}, + options::DisplayOptions +}; + +/// List all best practices or filter by category. +pub fn list(lang: Lang, category: Option<&str>, opts: &DisplayOptions) -> Result<()> { + let registry = PracticeRegistry::new(); + + println!(); + if opts.colored { + println!("{}", "RustManifest Best Practices".bold()); + } else { + println!("RustManifest Best Practices"); + } + println!(); + + let practices: Vec<_> = if let Some(cat) = category { + let cat = parse_category(cat); + if let Some(c) = cat { + registry.by_category(c) + } else { + return Err(AppError::InvalidCategory { + name: category.unwrap_or("").to_string() + }); + } + } else { + registry.all().collect() + }; + + if practices.is_empty() { + println!(" No practices found."); + return Ok(()); + } + + let mut sorted = practices; + sorted.sort_by_key(|p| p.code); + + let mut current_cat: Option = None; + for practice in &sorted { + if current_cat != Some(practice.category) { + current_cat = Some(practice.category); + println!(); + if opts.colored { + println!(" {}", practice.category.name(lang.code()).yellow().bold()); + } else { + println!(" {}", practice.category.name(lang.code())); + } + println!(); + } + + let title = practice.title.get(lang.code()); + if opts.colored { + println!(" {} - {title}", practice.code.cyan()); + } else { + println!(" {} - {title}", practice.code); + } + } + + println!(); + println!("Total: {} practices", sorted.len()); + println!(); + println!("Use `masterror practice ` to see details."); + println!(); + + Ok(()) +} + +/// Show a specific best practice. +pub fn show(lang: Lang, code: &str, opts: &DisplayOptions) -> Result<()> { + let registry = PracticeRegistry::new(); + + let Some(practice) = registry.find(code) else { + return Err(AppError::UnknownPracticeCode { + code: code.to_string() + }); + }; + + print_practice(lang, practice, opts); + Ok(()) +} + +fn parse_category(s: &str) -> Option { + match s.to_lowercase().as_str() { + "error-handling" | "error_handling" | "errorhandling" | "errors" => { + Some(PracticeCategory::ErrorHandling) + } + "performance" | "perf" => Some(PracticeCategory::Performance), + "naming" | "names" => Some(PracticeCategory::Naming), + "documentation" | "docs" | "doc" => Some(PracticeCategory::Documentation), + "design" | "architecture" | "arch" => Some(PracticeCategory::Design), + "testing" | "tests" | "test" => Some(PracticeCategory::Testing), + "security" | "sec" => Some(PracticeCategory::Security), + _ => None + } +} diff --git a/masterror-cli/src/config.rs b/masterror-cli/src/config.rs new file mode 100644 index 0000000..b9b0cb0 --- /dev/null +++ b/masterror-cli/src/config.rs @@ -0,0 +1,203 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Configuration management for masterror-cli. +//! +//! Supports layered configuration (highest priority first): +//! 1. CLI arguments +//! 2. Environment variables +//! 3. Local project config (.masterror.toml in current directory) +//! 4. Global config (~/.config/masterror/config.toml) +//! 5. Default values + +use std::{collections::HashMap, env, fs, path::PathBuf}; + +use serde::{Deserialize, Serialize}; + +use crate::error::{AppError, Result}; + +/// Global config file name. +const CONFIG_FILE: &str = "config.toml"; + +/// Local project config file name. +const LOCAL_CONFIG_FILE: &str = ".masterror.toml"; + +/// Config directory name. +const CONFIG_DIR: &str = "masterror"; + +/// Application configuration. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct Config { + /// General settings. + pub general: GeneralConfig, + /// Display settings. + pub display: DisplayConfig, + /// Command aliases. + pub aliases: HashMap +} + +/// General configuration options. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct GeneralConfig { + /// Language code (en, ru, ko). + pub lang: String, + /// Enable colored output. + pub colored: bool +} + +/// Display section toggles. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct DisplayConfig { + /// Show translated error message. + pub translation: bool, + /// Show "why this happens" explanation. + pub why: bool, + /// Show fix suggestions. + pub fix: bool, + /// Show documentation links. + pub links: bool, + /// Show original compiler output. + pub original: bool +} + +impl Default for GeneralConfig { + fn default() -> Self { + Self { + lang: "en".to_string(), + colored: true + } + } +} + +impl Default for DisplayConfig { + fn default() -> Self { + Self { + translation: true, + why: true, + fix: true, + links: true, + original: false + } + } +} + +impl Config { + /// Get global config directory path. + pub fn dir() -> Option { + dirs::config_dir().map(|p| p.join(CONFIG_DIR)) + } + + /// Get global config file path. + pub fn path() -> Option { + Self::dir().map(|p| p.join(CONFIG_FILE)) + } + + /// Get local project config path (.masterror.toml in current directory). + pub fn local_path() -> Option { + env::current_dir().ok().map(|p| p.join(LOCAL_CONFIG_FILE)) + } + + /// Check if this is the first run (no global config exists). + pub fn is_first_run() -> bool { + Self::path().is_none_or(|p| !p.exists()) + } + + /// Load config with layered priority: + /// 1. Local .masterror.toml (if exists) + /// 2. Global ~/.config/masterror/config.toml + /// 3. Defaults + pub fn load() -> Result { + // Try local config first + if let Some(local_path) = Self::local_path() + && local_path.exists() + { + let content = fs::read_to_string(&local_path)?; + let config: Config = toml::from_str(&content).map_err(|e| AppError::ConfigParse { + path: local_path.clone(), + message: e.message().to_string() + })?; + return Ok(config); + } + + // Try global config + let Some(path) = Self::path() else { + return Ok(Self::default()); + }; + + if !path.exists() { + return Ok(Self::default()); + } + + let content = fs::read_to_string(&path)?; + let config: Config = toml::from_str(&content).map_err(|e| AppError::ConfigParse { + path: path.clone(), + message: e.message().to_string() + })?; + + Ok(config) + } + + /// Save config to global file. + pub fn save(&self) -> Result<()> { + let Some(dir) = Self::dir() else { + return Err(AppError::Io(std::io::Error::other( + "could not determine config directory" + ))); + }; + + fs::create_dir_all(&dir)?; + + let path = dir.join(CONFIG_FILE); + let content = toml::to_string_pretty(self).map_err(|e| AppError::ConfigParse { + path: path.clone(), + message: e.to_string() + })?; + + fs::write(&path, content)?; + Ok(()) + } + + /// Save config to local project file (.masterror.toml). + pub fn save_local(&self) -> Result { + let path = env::current_dir()?.join(LOCAL_CONFIG_FILE); + let content = toml::to_string_pretty(self).map_err(|e| AppError::ConfigParse { + path: path.clone(), + message: e.to_string() + })?; + + fs::write(&path, &content)?; + Ok(path) + } + + /// Resolve command alias. + #[allow(dead_code)] + pub fn resolve_alias<'a>(&'a self, cmd: &'a str) -> &'a str { + self.aliases.get(cmd).map(String::as_str).unwrap_or(cmd) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_default_config() { + let config = Config::default(); + assert_eq!(config.general.lang, "en"); + assert!(config.general.colored); + assert!(config.display.why); + assert!(config.display.fix); + } + + #[test] + fn test_toml_roundtrip() { + let config = Config::default(); + let toml = toml::to_string_pretty(&config).unwrap(); + let parsed: Config = toml::from_str(&toml).unwrap(); + assert_eq!(parsed.general.lang, config.general.lang); + } +} diff --git a/masterror-cli/src/error.rs b/masterror-cli/src/error.rs new file mode 100644 index 0000000..bfeb345 --- /dev/null +++ b/masterror-cli/src/error.rs @@ -0,0 +1,169 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Application error types for masterror-cli. + +use std::{fmt, io, path::PathBuf}; + +/// Application-wide error type. +#[derive(Debug)] +pub enum AppError { + /// I/O error (file operations, process spawning). + Io(io::Error), + /// JSON parsing error from cargo output. + Json(serde_json::Error), + /// Cargo check process failed with exit code. + CargoFailed { + /// Exit code from cargo process. + code: i32 + }, + /// Cargo check process was terminated by signal. + CargoSignaled, + /// Unknown error code requested. + UnknownErrorCode { + /// The requested error code. + code: String + }, + /// Unknown practice code requested. + UnknownPracticeCode { + /// The requested practice code. + code: String + }, + /// Invalid category name. + InvalidCategory { + /// The invalid category name. + name: String + }, + /// Invalid command-line argument. + InvalidArgument { + /// The invalid argument. + arg: String + }, + /// Config file parse error. + ConfigParse { + /// Path to config file. + path: PathBuf, + /// Error message. + message: String + }, + /// Error with additional context. + #[allow(dead_code)] + WithContext { + /// Context message. + context: String, + /// Original error. + source: Box + } +} + +impl fmt::Display for AppError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Io(e) => write!(f, "I/O error: {e}"), + Self::Json(e) => write!(f, "JSON parse error: {e}"), + Self::CargoFailed { + code + } => write!(f, "cargo check failed with exit code {code}"), + Self::CargoSignaled => write!(f, "cargo check was terminated by signal"), + Self::UnknownErrorCode { + code + } => write!(f, "unknown error code: {code}"), + Self::UnknownPracticeCode { + code + } => write!(f, "unknown practice code: {code}"), + Self::InvalidCategory { + name + } => write!(f, "invalid category: {name}"), + Self::InvalidArgument { + arg + } => write!(f, "invalid argument: {arg}"), + Self::ConfigParse { + path, + message + } => write!(f, "config error in {}: {message}", path.display()), + Self::WithContext { + context, + source + } => write!(f, "{context}: {source}") + } + } +} + +impl std::error::Error for AppError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Self::Io(e) => Some(e), + Self::Json(e) => Some(e), + Self::WithContext { + source, .. + } => Some(source.as_ref()), + _ => None + } + } +} + +impl From for AppError { + fn from(err: io::Error) -> Self { + Self::Io(err) + } +} + +impl From for AppError { + fn from(err: serde_json::Error) -> Self { + Self::Json(err) + } +} + +/// Result type alias for AppError. +pub type Result = std::result::Result; + +/// Extension trait for adding context to Results. +/// +/// # Example +/// +/// ```ignore +/// use masterror::error::ResultExt; +/// +/// fs::read_to_string(path).context("reading config")?; +/// ``` +#[allow(dead_code)] +pub trait ResultExt { + /// Add static context to an error. + fn context(self, ctx: &'static str) -> Result; + + /// Add dynamic context to an error. + fn with_context(self, f: F) -> Result + where + F: FnOnce() -> S, + S: Into; +} + +impl ResultExt for std::result::Result +where + E: Into +{ + fn context(self, ctx: &'static str) -> Result { + self.map_err(|e| { + let inner = e.into(); + AppError::WithContext { + context: ctx.to_string(), + source: Box::new(inner) + } + }) + } + + fn with_context(self, f: F) -> Result + where + F: FnOnce() -> S, + S: Into + { + self.map_err(|e| { + let inner = e.into(); + AppError::WithContext { + context: f().into(), + source: Box::new(inner) + } + }) + } +} diff --git a/masterror-cli/src/main.rs b/masterror-cli/src/main.rs new file mode 100644 index 0000000..47b006a --- /dev/null +++ b/masterror-cli/src/main.rs @@ -0,0 +1,131 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! masterror CLI - Rust compiler error explainer. + +mod commands; +mod config; +mod error; +mod options; +mod output; +mod parser; +mod sections; + +use clap::{Parser, Subcommand}; +use masterror_knowledge::Lang; + +use crate::{config::Config, options::DisplayOptions}; + +#[derive(Parser)] +#[command(name = "masterror")] +#[command(author, version, about = "Rust compiler error explainer")] +struct Cli { + /// Language for explanations (en, ru, ko) + #[arg(short, long, env = "MASTERROR_LANG")] + lang: Option, + + /// Disable colored output + #[arg(long, env = "NO_COLOR")] + no_color: bool, + + #[command(subcommand)] + command: Commands +} + +#[derive(Subcommand)] +enum Commands { + /// Initialize configuration file + Init, + /// Run cargo check and explain errors + #[command(visible_alias = "c")] + Check { + #[arg(trailing_var_arg = true)] + args: Vec + }, + /// Explain a specific error code (E0382) or best practice (RA001) + #[command(visible_alias = "e")] + Explain { code: String }, + /// List all known error codes + #[command(visible_alias = "l")] + List { + #[arg(short, long)] + category: Option + }, + /// Show RustManifest best practices + #[command(visible_alias = "p")] + Practice { + /// Practice code (RA001-RA015) or empty for list + code: Option, + /// Filter by category + #[arg(short, long)] + category: Option + } +} + +fn main() { + let args: Vec = std::env::args().collect(); + let cli = if args.get(1).is_some_and(|a| a == "masterror") { + Cli::parse_from( + args.into_iter() + .enumerate() + .filter_map(|(i, a)| if i == 1 { None } else { Some(a) }) + ) + } else { + Cli::parse() + }; + + // Check for first run and run setup if needed (except for init command) + if !matches!(cli.command, Commands::Init) + && let Err(e) = commands::init::check_first_run(true) + { + eprintln!("Setup failed: {e}"); + std::process::exit(1); + } + + let config = Config::load().unwrap_or_default(); + let lang_str = cli.lang.as_deref().unwrap_or(&config.general.lang); + let lang = Lang::from_code(lang_str); + let colored = if cli.no_color { + false + } else { + config.general.colored + }; + + let opts = DisplayOptions { + colored, + show_translation: config.display.translation, + show_why: config.display.why, + show_fix: config.display.fix, + show_links: config.display.links, + show_original: config.display.original + }; + + let result = match &cli.command { + Commands::Init => commands::init(lang, opts.colored), + Commands::Check { + args + } => commands::check(lang, args, &opts), + Commands::Explain { + code + } => commands::explain(lang, code, &opts), + Commands::List { + category + } => commands::list(lang, category.as_deref(), &opts), + Commands::Practice { + code, + category + } => { + if let Some(c) = code { + commands::practice::show(lang, c, &opts) + } else { + commands::practice::list(lang, category.as_deref(), &opts) + } + } + }; + + if let Err(e) = result { + eprintln!("Error: {e}"); + std::process::exit(1); + } +} diff --git a/masterror-cli/src/options.rs b/masterror-cli/src/options.rs new file mode 100644 index 0000000..8256a87 --- /dev/null +++ b/masterror-cli/src/options.rs @@ -0,0 +1,138 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Display options for masterror output. + +/// What sections to show in masterror block. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct DisplayOptions { + /// Enable colored output. + pub colored: bool, + /// Show translated error message. + pub show_translation: bool, + /// Show "why this happens" explanation. + pub show_why: bool, + /// Show fix suggestions. + pub show_fix: bool, + /// Show documentation links. + pub show_links: bool, + /// Show original compiler output. + pub show_original: bool +} + +impl DisplayOptions { + /// Default options as const value. + pub const DEFAULT: Self = Self { + colored: true, + show_translation: true, + show_why: true, + show_fix: true, + show_links: true, + show_original: false + }; + + /// Create new builder for constructing DisplayOptions. + #[allow(dead_code)] + pub const fn builder() -> DisplayOptionsBuilder { + DisplayOptionsBuilder::new() + } +} + +impl Default for DisplayOptions { + fn default() -> Self { + Self::DEFAULT + } +} + +/// Builder for constructing DisplayOptions with const support. +/// +/// # Example +/// +/// ```ignore +/// use masterror_cli::options::DisplayOptions; +/// +/// const OPTS: DisplayOptions = DisplayOptions::builder() +/// .colored(false) +/// .show_original(true) +/// .build(); +/// ``` +#[derive(Clone, Copy, Debug)] +#[allow(dead_code)] +pub struct DisplayOptionsBuilder { + colored: bool, + show_translation: bool, + show_why: bool, + show_fix: bool, + show_links: bool, + show_original: bool +} + +#[allow(dead_code)] +impl DisplayOptionsBuilder { + /// Create new builder with default values. + pub const fn new() -> Self { + Self { + colored: true, + show_translation: true, + show_why: true, + show_fix: true, + show_links: true, + show_original: false + } + } + + /// Set colored output. + pub const fn colored(mut self, value: bool) -> Self { + self.colored = value; + self + } + + /// Set show translation. + pub const fn show_translation(mut self, value: bool) -> Self { + self.show_translation = value; + self + } + + /// Set show why explanation. + pub const fn show_why(mut self, value: bool) -> Self { + self.show_why = value; + self + } + + /// Set show fix suggestions. + pub const fn show_fix(mut self, value: bool) -> Self { + self.show_fix = value; + self + } + + /// Set show documentation links. + pub const fn show_links(mut self, value: bool) -> Self { + self.show_links = value; + self + } + + /// Set show original compiler output. + pub const fn show_original(mut self, value: bool) -> Self { + self.show_original = value; + self + } + + /// Build the DisplayOptions. + pub const fn build(self) -> DisplayOptions { + DisplayOptions { + colored: self.colored, + show_translation: self.show_translation, + show_why: self.show_why, + show_fix: self.show_fix, + show_links: self.show_links, + show_original: self.show_original + } + } +} + +impl Default for DisplayOptionsBuilder { + fn default() -> Self { + Self::new() + } +} diff --git a/masterror-cli/src/output.rs b/masterror-cli/src/output.rs new file mode 100644 index 0000000..4e0167c --- /dev/null +++ b/masterror-cli/src/output.rs @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Terminal output formatting for errors. + +use masterror_knowledge::{ErrorEntry, ErrorRegistry, Lang, UiMsg}; +use owo_colors::OwoColorize; + +use crate::{options::DisplayOptions, parser::CargoMessage, sections}; + +const SEPARATOR: &str = "--- masterror ----------------------------------------"; +const SEPARATOR_END: &str = "------------------------------------------------------"; + +/// Print error with masterror explanation. +pub fn print_error(lang: Lang, msg: &CargoMessage, opts: &DisplayOptions) { + let rendered = msg.rendered_output(); + + if opts.show_original + && let Some(r) = rendered + { + print!("{}", r.trim_end()); + } + + let Some(code) = msg.error_code() else { + if opts.show_original { + println!(); + } + return; + }; + + let registry = ErrorRegistry::new(); + let Some(entry) = registry.find(code) else { + if opts.show_original { + println!(); + } + return; + }; + + println!(); + print_block(lang, entry, rendered, opts); +} + +fn print_block(lang: Lang, entry: &ErrorEntry, rendered: Option<&str>, opts: &DisplayOptions) { + if opts.colored { + println!("{}", SEPARATOR.dimmed()); + } else { + println!("{SEPARATOR}"); + } + + if opts.show_translation { + sections::translation::print(lang, rendered, opts.colored); + } + + if opts.show_why { + let label = UiMsg::LabelWhy.get(lang); + if opts.colored { + println!("{}", label.green().bold()); + } else { + println!("{label}"); + } + println!("{}", entry.explanation.get(lang.code())); + } + + if opts.show_fix { + sections::fix::print(lang, entry.fixes, opts.colored); + } + + if opts.show_links { + sections::link::print(lang, entry.links, opts.colored); + } + + if opts.colored { + println!("{}", SEPARATOR_END.dimmed()); + } else { + println!("{SEPARATOR_END}"); + } +} diff --git a/masterror-cli/src/parser.rs b/masterror-cli/src/parser.rs new file mode 100644 index 0000000..6b25c8f --- /dev/null +++ b/masterror-cli/src/parser.rs @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Cargo JSON output parser. + +use serde::Deserialize; + +/// Top-level cargo message. +#[derive(Deserialize)] +pub struct CargoMessage { + pub reason: String, + pub message: Option, + /// Full rendered compiler output. + pub rendered: Option +} + +/// Compiler diagnostic message. +#[derive(Deserialize)] +pub struct DiagnosticMessage { + pub level: String, + #[allow(dead_code)] + pub message: String, + pub code: Option, + pub rendered: Option +} + +/// Error code info. +#[derive(Deserialize)] +pub struct DiagnosticCode { + pub code: String +} + +impl CargoMessage { + /// Check if this is a compiler error message. + pub fn is_error(&self) -> bool { + self.reason == "compiler-message" + && self.message.as_ref().is_some_and(|m| m.level == "error") + } + + /// Get the error code if present. + pub fn error_code(&self) -> Option<&str> { + self.message + .as_ref() + .and_then(|m| m.code.as_ref()) + .map(|c| c.code.as_str()) + } + + /// Get the error message. + #[allow(dead_code)] + pub fn error_message(&self) -> Option<&str> { + self.message.as_ref().map(|m| m.message.as_str()) + } + + /// Get rendered output (from message or top-level). + pub fn rendered_output(&self) -> Option<&str> { + self.message + .as_ref() + .and_then(|m| m.rendered.as_deref()) + .or(self.rendered.as_deref()) + } +} diff --git a/masterror-cli/src/sections/fix.rs b/masterror-cli/src/sections/fix.rs new file mode 100644 index 0000000..113c62d --- /dev/null +++ b/masterror-cli/src/sections/fix.rs @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Fix section - shows fix suggestions with code examples. + +use masterror_knowledge::{FixSuggestion, Lang, UiMsg}; +use owo_colors::OwoColorize; + +/// Print fix suggestions with code examples. +pub fn print(lang: Lang, fixes: &[FixSuggestion], colored: bool) { + if fixes.is_empty() { + return; + } + + let label = UiMsg::LabelFix.get(lang); + + if colored { + println!("{}", label.green().bold()); + } else { + println!("{label}"); + } + + for (i, fix) in fixes.iter().enumerate() { + let desc = fix.description.get(lang.code()); + let num = i + 1; + if colored { + println!(" {}. {}", num.cyan(), desc); + println!(" {}", fix.code.dimmed()); + } else { + println!(" {num}. {desc}"); + println!(" {}", fix.code); + } + } +} diff --git a/masterror-cli/src/sections/link.rs b/masterror-cli/src/sections/link.rs new file mode 100644 index 0000000..d8e8843 --- /dev/null +++ b/masterror-cli/src/sections/link.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Link section - shows documentation URLs. + +use masterror_knowledge::{DocLink, Lang, UiMsg}; +use owo_colors::OwoColorize; + +/// Print documentation links with titles. +pub fn print(lang: Lang, links: &[DocLink], colored: bool) { + if links.is_empty() { + return; + } + + let label = UiMsg::LabelLink.get(lang); + + if colored { + println!("{}", label.blue().bold()); + } else { + println!("{label}"); + } + + for link in links { + if colored { + println!(" {} {}", link.title.cyan(), link.url.underline().dimmed()); + } else { + println!(" {} {}", link.title, link.url); + } + } +} diff --git a/masterror-cli/src/sections/mod.rs b/masterror-cli/src/sections/mod.rs new file mode 100644 index 0000000..82c32d3 --- /dev/null +++ b/masterror-cli/src/sections/mod.rs @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Output sections for masterror block. + +pub mod fix; +pub mod link; +pub mod translation; diff --git a/masterror-cli/src/sections/translation.rs b/masterror-cli/src/sections/translation.rs new file mode 100644 index 0000000..c9a4758 --- /dev/null +++ b/masterror-cli/src/sections/translation.rs @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Translation section - shows full translated compiler error. + +use masterror_knowledge::{Lang, UiMsg, phrases::translate_rendered}; +use owo_colors::OwoColorize; + +/// Print full translated copy of compiler error. +pub fn print(lang: Lang, rendered: Option<&str>, colored: bool) { + if matches!(lang, Lang::En) { + return; + } + + let Some(rendered) = rendered else { + return; + }; + + let translated = translate_rendered(rendered, lang); + + let label = UiMsg::LabelTranslation.get(lang); + + if colored { + println!("{}", label.cyan().bold()); + } else { + println!("{label}"); + } + + for line in translated.lines() { + println!(" {line}"); + } +} diff --git a/masterror-knowledge/Cargo.toml b/masterror-knowledge/Cargo.toml new file mode 100644 index 0000000..fce37d1 --- /dev/null +++ b/masterror-knowledge/Cargo.toml @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +[package] +name = "masterror-knowledge" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +description = "Knowledge base for Rust compiler errors and best practices" +keywords = ["rust", "compiler", "errors", "explain", "learning"] +categories = ["development-tools", "command-line-utilities"] + +[features] +default = ["lang-ru", "lang-ko"] + +# Languages +lang-ru = [] +lang-ko = [] + +[dependencies] +arrayvec = "0.7" +aho-corasick = "1" diff --git a/masterror-knowledge/src/errors/borrowing.rs b/masterror-knowledge/src/errors/borrowing.rs new file mode 100644 index 0000000..d857c8b --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Borrowing-related errors. + +mod e0499; +mod e0500; +mod e0501; +mod e0502; +mod e0503; +mod e0506; +mod e0508; +mod e0596; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0499::ENTRY, + &e0500::ENTRY, + &e0501::ENTRY, + &e0502::ENTRY, + &e0503::ENTRY, + &e0506::ENTRY, + &e0508::ENTRY, + &e0596::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/borrowing/e0499.rs b/masterror-knowledge/src/errors/borrowing/e0499.rs new file mode 100644 index 0000000..b43ca0b --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0499.rs @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0499: cannot borrow as mutable more than once + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0499", + title: LocalizedText::new( + "Cannot borrow as mutable more than once", + "Нельзя заимствовать как изменяемое более одного раза", + "가변으로 두 번 이상 빌릴 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +Rust allows only ONE mutable reference to data at a time. This is stricter +than the immutable borrowing rule and prevents all aliased mutation. + +Why? Two mutable references to the same data could lead to: +- Data races in concurrent code +- Iterator invalidation +- Dangling pointers after reallocation + +This rule is checked at compile time, giving you fearless concurrency.", + "\ +Rust разрешает только ОДНУ изменяемую ссылку на данные одновременно. +Это строже правила неизменяемого заимствования. + +Почему? Две изменяемые ссылки на одни данные могут привести к: +- Гонкам данных в конкурентном коде +- Инвалидации итераторов +- Висячим указателям после реаллокации", + "\ +Rust는 데이터에 대해 한 번에 하나의 가변 참조만 허용합니다. +이는 불변 빌림 규칙보다 엄격합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Use scopes to limit borrow lifetime", + "Использовать области видимости", + "스코프를 사용하여 빌림 수명 제한" + ), + code: "{ let r1 = &mut x; *r1 += 1; } // r1 dropped\nlet r2 = &mut x;" + }, + FixSuggestion { + description: LocalizedText::new( + "Use RefCell for interior mutability", + "Использовать RefCell", + "내부 가변성을 위해 RefCell 사용" + ), + code: "use std::cell::RefCell;\nlet x = RefCell::new(value);" + } + ], + links: &[ + DocLink { + title: "Rust Book: Mutable References", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#mutable-references" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0499.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0500.rs b/masterror-knowledge/src/errors/borrowing/e0500.rs new file mode 100644 index 0000000..8721f48 --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0500.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0500: closure requires unique access but X is already borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0500", + title: LocalizedText::new( + "Closure requires unique access but value is already borrowed", + "Замыкание требует уникальный доступ, но значение уже заимствовано", + "클로저가 고유 접근을 필요로 하지만 값이 이미 빌려짐" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +A closure that mutates a captured variable needs exclusive access to it. +But you've already borrowed the value elsewhere, creating a conflict. + +Closures that capture by mutable reference act like mutable borrows.", + "\ +Замыкание, изменяющее захваченную переменную, требует эксклюзивного доступа.", + "\ +캡처된 변수를 변경하는 클로저는 독점적인 접근이 필요합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the borrow before the closure", + "Завершить заимствование перед замыканием", + "클로저 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); }\nlet c = || x += 1;" + }, + FixSuggestion { + description: LocalizedText::new( + "Move the value into the closure", + "Переместить значение в замыкание", + "클로저로 값 이동" + ), + code: "let c = move || { x += 1; };" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0500.html" + }] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0501.rs b/masterror-knowledge/src/errors/borrowing/e0501.rs new file mode 100644 index 0000000..34298ab --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0501.rs @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0501: cannot borrow X as mutable because previous closure requires unique +//! access + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0501", + title: LocalizedText::new( + "Cannot borrow because closure requires unique access", + "Нельзя заимствовать, так как замыкание требует уникальный доступ", + "클로저가 고유 접근을 필요로 하여 빌릴 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +A closure has captured a variable mutably, and now you're trying to borrow +that same variable again. The closure's capture acts like a mutable borrow +that lasts for the closure's entire lifetime.", + "\ +Замыкание захватило переменную изменяемо, и теперь вы пытаетесь заимствовать +ту же переменную снова.", + "\ +클로저가 변수를 가변으로 캡처했고, 이제 같은 변수를 다시 빌리려고 합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Use the closure before borrowing again", + "Использовать замыкание перед повторным заимствованием", + "다시 빌리기 전에 클로저 사용" + ), + code: "let mut c = || x += 1;\nc(); // use closure\nlet r = &x; // now safe" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0501.html" + }] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0502.rs b/masterror-knowledge/src/errors/borrowing/e0502.rs new file mode 100644 index 0000000..fa372c0 --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0502.rs @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0502: cannot borrow as mutable because also borrowed as immutable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0502", + title: LocalizedText::new( + "Cannot borrow as mutable (already borrowed as immutable)", + "Нельзя заимствовать как изменяемое (уже заимствовано как неизменяемое)", + "가변으로 빌릴 수 없음 (이미 불변으로 빌림)" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +Rust enforces a strict borrowing rule: you can have EITHER one mutable +reference OR any number of immutable references, but never both at once. + +This prevents data races at compile time. If you could mutate data while +someone else is reading it, the reader might see inconsistent state. + +The immutable borrow is still \"active\" because it's used later in code.", + "\ +Rust применяет строгое правило: можно иметь ЛИБО одну изменяемую ссылку, +ЛИБО любое количество неизменяемых, но никогда обе одновременно. + +Это предотвращает гонки данных.", + "\ +Rust는 엄격한 빌림 규칙을 적용합니다: 하나의 가변 참조 또는 여러 불변 참조를 +가질 수 있지만, 동시에 둘 다 가질 수는 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the immutable borrow before mutating", + "Завершить неизменяемое заимствование", + "변경 전에 불변 빌림 종료" + ), + code: "{ let r = &x; println!(\"{}\", r); } // r dropped\nx.push(1);" + }, + FixSuggestion { + description: LocalizedText::new( + "Clone before mutation", + "Клонировать перед изменением", + "변경 전에 복제" + ), + code: "let copy = x[0].clone();\nx.push(copy);" + } + ], + links: &[ + DocLink { + title: "Rust Book: References and Borrowing", + url: "https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0502.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0503.rs b/masterror-knowledge/src/errors/borrowing/e0503.rs new file mode 100644 index 0000000..083a5c3 --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0503.rs @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0503: cannot use X because it was mutably borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0503", + title: LocalizedText::new( + "Cannot use value because it was mutably borrowed", + "Нельзя использовать значение, так как оно изменяемо заимствовано", + "가변으로 빌려져서 값을 사용할 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +While a mutable borrow is active, you cannot access the original value +in any way. This prevents you from observing partially modified state +or creating aliased mutable references. + +The mutable borrow has exclusive access until it ends.", + "\ +Пока активно изменяемое заимствование, вы не можете обращаться к +исходному значению никак.", + "\ +가변 빌림이 활성화된 동안 원래 값에 어떤 방식으로도 접근할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "End the mutable borrow first", + "Сначала завершить изменяемое заимствование", + "먼저 가변 빌림 종료" + ), + code: "{ let r = &mut x; modify(r); } // r dropped\nuse_value(&x);" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0503.html" + }] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0506.rs b/masterror-knowledge/src/errors/borrowing/e0506.rs new file mode 100644 index 0000000..8c3a482 --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0506.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0506: cannot assign to X because it is borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0506", + title: LocalizedText::new( + "Cannot assign because it is borrowed", + "Нельзя присвоить, так как значение заимствовано", + "빌려져 있어서 할당할 수 없음" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to assign to a value while a borrow of it exists. +This would invalidate the existing reference. + +You must wait for all borrows to end before assigning a new value.", + "\ +Вы пытаетесь присвоить значение, пока существует его заимствование.", + "\ +빌림이 존재하는 동안 값에 할당하려고 합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "End the borrow before assigning", + "Завершить заимствование перед присваиванием", + "할당 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); } // borrow ends\nx = new_value;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0506.html" + }] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0508.rs b/masterror-knowledge/src/errors/borrowing/e0508.rs new file mode 100644 index 0000000..4b0449c --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0508.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0508: cannot move out of type `[T]`, a non-copy slice + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0508", + title: LocalizedText::new( + "Cannot move out of type, a non-copy slice", + "Нельзя переместить из типа — это не-Copy срез", + "타입에서 이동할 수 없음, 비복사 슬라이스" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to move a value out of a slice, but slices don't own their data. +They're just views into an array or Vec. + +Moving out would leave a \"hole\" in the slice, which isn't allowed.", + "\ +Вы пытаетесь переместить значение из среза, но срезы не владеют данными.", + "\ +슬라이스에서 값을 이동하려고 하지만, 슬라이스는 데이터를 소유하지 않습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Clone the element", + "Клонировать элемент", + "요소 복제" + ), + code: "let elem = slice[i].clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use into_iter() on Vec", + "Использовать into_iter() на Vec", + "Vec에 into_iter() 사용" + ), + code: "for elem in vec.into_iter() { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0508.html" + }] +}; diff --git a/masterror-knowledge/src/errors/borrowing/e0596.rs b/masterror-knowledge/src/errors/borrowing/e0596.rs new file mode 100644 index 0000000..3f17af3 --- /dev/null +++ b/masterror-knowledge/src/errors/borrowing/e0596.rs @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0596: cannot borrow as mutable, as it is not declared as mutable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0596", + title: LocalizedText::new( + "Cannot borrow as mutable (not declared as mutable)", + "Нельзя заимствовать как изменяемое (не объявлено как изменяемое)", + "가변으로 빌릴 수 없음 (가변으로 선언되지 않음)" + ), + category: Category::Borrowing, + explanation: LocalizedText::new( + "\ +You're trying to get a mutable reference to something that wasn't declared +as mutable. To modify through a reference, the original binding must be `mut`. + +This is Rust's way of making mutation explicit and visible in the code.", + "\ +Вы пытаетесь получить изменяемую ссылку на то, что не было объявлено +как изменяемое. Для изменения через ссылку оригинал должен быть `mut`.", + "\ +가변으로 선언되지 않은 것에 대한 가변 참조를 얻으려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Add mut to the variable declaration", + "Добавить mut к объявлению переменной", + "변수 선언에 mut 추가" + ), + code: "let mut x = vec![1, 2, 3];" + }, + FixSuggestion { + description: LocalizedText::new( + "Add mut to function parameter", + "Добавить mut к параметру функции", + "함수 매개변수에 mut 추가" + ), + code: "fn process(data: &mut Vec) { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0596.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes.rs b/masterror-knowledge/src/errors/lifetimes.rs new file mode 100644 index 0000000..8132ece --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes.rs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Lifetime-related errors. + +mod e0106; +mod e0495; +mod e0515; +mod e0597; +mod e0621; +mod e0623; +mod e0700; +mod e0716; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0106::ENTRY, + &e0495::ENTRY, + &e0515::ENTRY, + &e0597::ENTRY, + &e0621::ENTRY, + &e0623::ENTRY, + &e0700::ENTRY, + &e0716::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/lifetimes/e0106.rs b/masterror-knowledge/src/errors/lifetimes/e0106.rs new file mode 100644 index 0000000..3d10310 --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0106.rs @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0106: missing lifetime specifier + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0106", + title: LocalizedText::new( + "Missing lifetime specifier", + "Отсутствует спецификатор времени жизни", + "라이프타임 지정자 누락" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +References in Rust have lifetimes - they describe how long the reference +is valid. Usually the compiler infers lifetimes, but sometimes you must +be explicit. + +Lifetime annotations don't change how long values live. They describe +relationships between references so the compiler can verify safety.", + "\ +Ссылки в Rust имеют времена жизни — они описывают, как долго ссылка +действительна. Обычно компилятор выводит времена жизни, но иногда нужно +указать явно.", + "\ +Rust의 참조에는 라이프타임이 있습니다 - 참조가 얼마나 오래 유효한지 설명합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Add explicit lifetime parameter", + "Добавить явный параметр времени жизни", + "명시적 라이프타임 매개변수 추가" + ), + code: "struct Foo<'a> { x: &'a str }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use owned type instead", + "Использовать владеющий тип", + "소유 타입 사용" + ), + code: "struct Foo { x: String }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use 'static for compile-time constants", + "Использовать 'static для констант", + "컴파일 시간 상수에 'static 사용" + ), + code: "fn get_str() -> &'static str { \"hello\" }" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0106.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0495.rs b/masterror-knowledge/src/errors/lifetimes/e0495.rs new file mode 100644 index 0000000..a5ce0a0 --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0495.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0495: cannot infer an appropriate lifetime + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0495", + title: LocalizedText::new( + "Cannot infer an appropriate lifetime", + "Невозможно вывести подходящее время жизни", + "적절한 라이프타임을 추론할 수 없음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +The compiler found conflicting lifetime requirements and couldn't +determine which one to use.", + "\ +Компилятор обнаружил конфликтующие требования времён жизни.", + "\ +컴파일러가 충돌하는 라이프타임 요구사항을 찾았습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add explicit lifetime bounds", + "Добавить явные ограничения времени жизни", + "명시적 라이프타임 바운드 추가" + ), + code: "fn process<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0495.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0515.rs b/masterror-knowledge/src/errors/lifetimes/e0515.rs new file mode 100644 index 0000000..f8ca6a2 --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0515.rs @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0515: cannot return reference to temporary value + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0515", + title: LocalizedText::new( + "Cannot return reference to temporary value", + "Нельзя вернуть ссылку на временное значение", + "임시 값에 대한 참조를 반환할 수 없음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +You're trying to return a reference to a value that was created inside +the function. When the function returns, that value is dropped. + +The reference would point to freed memory - a dangling pointer.", + "\ +Вы пытаетесь вернуть ссылку на значение, созданное внутри функции. +При возврате из функции это значение будет уничтожено.", + "\ +함수 내에서 생성된 값에 대한 참조를 반환하려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Return owned value instead of reference", + "Вернуть владеющее значение вместо ссылки", + "참조 대신 소유 값 반환" + ), + code: "fn create() -> String { String::from(\"hello\") }" + }, + FixSuggestion { + description: LocalizedText::new( + "Use a parameter lifetime", + "Использовать время жизни параметра", + "매개변수 라이프타임 사용" + ), + code: "fn longest<'a>(x: &'a str, y: &'a str) -> &'a str" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0515.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0597.rs b/masterror-knowledge/src/errors/lifetimes/e0597.rs new file mode 100644 index 0000000..bf3f11f --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0597.rs @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0597: value does not live long enough + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0597", + title: LocalizedText::new( + "Value does not live long enough", + "Значение живёт недостаточно долго", + "값이 충분히 오래 살지 않음" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +You're creating a reference to something that will be destroyed before +the reference is used. This would create a dangling pointer. + +Rust prevents this at compile time. The referenced value must live at +least as long as the reference itself.", + "\ +Вы создаёте ссылку на что-то, что будет уничтожено до использования ссылки.", + "\ +참조가 사용되기 전에 파괴될 것에 대한 참조를 만들고 있습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Move value to outer scope", + "Переместить значение во внешнюю область", + "값을 외부 스코프로 이동" + ), + code: "let s = String::from(\"hello\"); // declare before use" + }, + FixSuggestion { + description: LocalizedText::new( + "Return owned value instead", + "Вернуть владеющее значение", + "소유 값 반환" + ), + code: "fn get() -> String { s.to_string() }" + } + ], + links: &[ + DocLink { + title: "Rust Book: Lifetimes", + url: "https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0597.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0621.rs b/masterror-knowledge/src/errors/lifetimes/e0621.rs new file mode 100644 index 0000000..b7247fc --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0621.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0621: explicit lifetime required in the type of X + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0621", + title: LocalizedText::new( + "Explicit lifetime required in the type", + "Требуется явное время жизни в типе", + "타입에 명시적 라이프타임이 필요함" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +The compiler cannot infer lifetimes in this context. You need to add +explicit lifetime annotations to show how references relate.", + "\ +Компилятор не может вывести времена жизни в этом контексте.", + "\ +컴파일러가 이 컨텍스트에서 라이프타임을 추론할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add lifetime parameter to function", + "Добавить параметр времени жизни к функции", + "함수에 라이프타임 매개변수 추가" + ), + code: "fn process<'a>(data: &'a str) -> &'a str { data }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0621.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0623.rs b/masterror-knowledge/src/errors/lifetimes/e0623.rs new file mode 100644 index 0000000..152bb3b --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0623.rs @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0623: lifetime mismatch + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0623", + title: LocalizedText::new( + "Lifetime mismatch", + "Несоответствие времён жизни", + "라이프타임 불일치" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +Two lifetimes in your code don't match where they should.", + "\ +Два времени жизни в коде не совпадают там, где должны.", + "\ +코드에서 두 라이프타임이 일치해야 하는 곳에서 일치하지 않습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Ensure consistent lifetime annotations", + "Обеспечить согласованные аннотации", + "일관된 라이프타임 어노테이션 확보" + ), + code: "fn foo<'a>(x: &'a str) -> &'a str { x }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0623.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0700.rs b/masterror-knowledge/src/errors/lifetimes/e0700.rs new file mode 100644 index 0000000..f0ec8d0 --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0700.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0700: hidden type captures lifetime + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0700", + title: LocalizedText::new( + "Hidden type captures lifetime", + "Скрытый тип захватывает время жизни", + "숨겨진 타입이 라이프타임을 캡처함" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +When using `impl Trait` return type, the hidden concrete type captures +a lifetime that isn't declared in the function signature.", + "\ +При использовании типа возврата `impl Trait` скрытый конкретный тип +захватывает время жизни, не объявленное в сигнатуре.", + "\ +`impl Trait` 반환 타입을 사용할 때, 숨겨진 구체적 타입이 선언되지 않은 라이프타임을 캡처합니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Declare the captured lifetime", + "Объявить захваченное время жизни", + "캡처된 라이프타임 선언" + ), + code: "fn foo<'a>(x: &'a str) -> impl Iterator + 'a" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0700.html" + }] +}; diff --git a/masterror-knowledge/src/errors/lifetimes/e0716.rs b/masterror-knowledge/src/errors/lifetimes/e0716.rs new file mode 100644 index 0000000..f12a054 --- /dev/null +++ b/masterror-knowledge/src/errors/lifetimes/e0716.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0716: temporary value dropped while borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0716", + title: LocalizedText::new( + "Temporary value dropped while borrowed", + "Временное значение уничтожено во время заимствования", + "빌린 동안 임시 값이 삭제됨" + ), + category: Category::Lifetimes, + explanation: LocalizedText::new( + "\ +A temporary value was created, borrowed, and then immediately dropped. +The borrow outlives the temporary. + +Temporaries only live until the end of the statement by default.", + "\ +Было создано временное значение, заимствовано и сразу уничтожено.", + "\ +임시 값이 생성되고, 빌려지고, 즉시 삭제되었습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Bind temporary to a variable", + "Привязать временное значение к переменной", + "임시 값을 변수에 바인딩" + ), + code: "let value = create_value();\nlet reference = &value;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0716.html" + }] +}; diff --git a/masterror-knowledge/src/errors/mod.rs b/masterror-knowledge/src/errors/mod.rs new file mode 100644 index 0000000..df40cc0 --- /dev/null +++ b/masterror-knowledge/src/errors/mod.rs @@ -0,0 +1,213 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Rust compiler error explanations organized by category. + +pub mod borrowing; +pub mod lifetimes; +pub mod ownership; +pub mod raprogramm; +pub mod resolution; +pub mod traits; +pub mod types; + +use std::{collections::HashMap, sync::LazyLock}; + +use arrayvec::ArrayString; + +/// Global error registry singleton. +static ERROR_REGISTRY: LazyLock = LazyLock::new(ErrorRegistry::build); + +/// Link with title for documentation. +#[derive(Debug, Clone, Copy)] +pub struct DocLink { + /// Link display title. + pub title: &'static str, + /// URL to documentation. + pub url: &'static str +} + +/// Fix suggestion with code example. +#[derive(Debug, Clone, Copy)] +pub struct FixSuggestion { + /// Description of the fix approach. + pub description: LocalizedText, + /// Code example showing the fix. + pub code: &'static str +} + +/// Localized text with translations. +/// +/// All fields are `&'static str` for zero-copy access. +#[derive(Debug, Clone, Copy)] +pub struct LocalizedText { + /// English text (always present). + pub en: &'static str, + /// Russian translation. + pub ru: &'static str, + /// Korean translation. + pub ko: &'static str +} + +impl LocalizedText { + pub const fn new(en: &'static str, ru: &'static str, ko: &'static str) -> Self { + Self { + en, + ru, + ko + } + } + + pub fn get(&self, lang: &str) -> &'static str { + match lang { + "ru" => self.ru, + "ko" => self.ko, + _ => self.en + } + } +} + +/// Error category. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Category { + Ownership, + Borrowing, + Lifetimes, + Types, + Traits, + Resolution +} + +impl Category { + pub fn name(&self, lang: &str) -> &'static str { + match (self, lang) { + (Self::Ownership, "ru") => "Владение", + (Self::Ownership, "ko") => "소유권", + (Self::Ownership, _) => "Ownership", + + (Self::Borrowing, "ru") => "Заимствование", + (Self::Borrowing, "ko") => "빌림", + (Self::Borrowing, _) => "Borrowing", + + (Self::Lifetimes, "ru") => "Времена жизни", + (Self::Lifetimes, "ko") => "라이프타임", + (Self::Lifetimes, _) => "Lifetimes", + + (Self::Types, "ru") => "Типы", + (Self::Types, "ko") => "타입", + (Self::Types, _) => "Types", + + (Self::Traits, "ru") => "Трейты", + (Self::Traits, "ko") => "트레이트", + (Self::Traits, _) => "Traits", + + (Self::Resolution, "ru") => "Разрешение имён", + (Self::Resolution, "ko") => "이름 확인", + (Self::Resolution, _) => "Name Resolution" + } + } +} + +/// Complete error entry. +/// +/// Fields ordered by size (largest first) to minimize padding. +#[derive(Debug, Clone)] +pub struct ErrorEntry { + /// Error explanation text. + pub explanation: LocalizedText, + /// Short error title. + pub title: LocalizedText, + /// Suggested fixes. + pub fixes: &'static [FixSuggestion], + /// Documentation links. + pub links: &'static [DocLink], + /// Error code (E0382). + pub code: &'static str, + /// Error category. + pub category: Category +} + +/// Registry of all known errors. +pub struct ErrorRegistry { + errors: HashMap<&'static str, &'static ErrorEntry> +} + +impl ErrorRegistry { + /// Get the global registry instance. + pub fn new() -> &'static Self { + &ERROR_REGISTRY + } + + /// Build registry from all modules. + fn build() -> Self { + let mut errors = HashMap::with_capacity(34); + + for entry in ownership::entries() { + errors.insert(entry.code, *entry); + } + for entry in borrowing::entries() { + errors.insert(entry.code, *entry); + } + for entry in lifetimes::entries() { + errors.insert(entry.code, *entry); + } + for entry in types::entries() { + errors.insert(entry.code, *entry); + } + for entry in traits::entries() { + errors.insert(entry.code, *entry); + } + for entry in resolution::entries() { + errors.insert(entry.code, *entry); + } + + Self { + errors + } + } + + /// Find error by code. + /// + /// Accepts formats: "E0382", "e0382", "0382". + /// Uses stack-allocated buffer to avoid heap allocation. + pub fn find(&self, code: &str) -> Option<&'static ErrorEntry> { + // Fast path: try exact match first (covers "E0382" case) + if let Some(entry) = self.errors.get(code) { + return Some(*entry); + } + + // Normalize to uppercase with 'E' prefix using stack buffer + let mut buf: ArrayString<8> = ArrayString::new(); + + if !code.starts_with('E') && !code.starts_with('e') { + buf.push('E'); + } + + for c in code.chars().take(7) { + buf.push(c.to_ascii_uppercase()); + } + + self.errors.get(buf.as_str()).copied() + } + + /// Get all errors. + pub fn all(&self) -> impl Iterator + '_ { + self.errors.values().copied() + } + + /// Get errors by category. + pub fn by_category(&self, cat: Category) -> Vec<&'static ErrorEntry> { + self.errors + .values() + .filter(|e| e.category == cat) + .copied() + .collect() + } +} + +impl Default for &'static ErrorRegistry { + fn default() -> Self { + ErrorRegistry::new() + } +} diff --git a/masterror-knowledge/src/errors/ownership.rs b/masterror-knowledge/src/errors/ownership.rs new file mode 100644 index 0000000..516a81b --- /dev/null +++ b/masterror-knowledge/src/errors/ownership.rs @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Ownership-related errors. + +mod e0381; +mod e0382; +mod e0383; +mod e0384; +mod e0505; +mod e0507; +mod e0509; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[ + &e0381::ENTRY, + &e0382::ENTRY, + &e0383::ENTRY, + &e0384::ENTRY, + &e0505::ENTRY, + &e0507::ENTRY, + &e0509::ENTRY +]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/ownership/e0381.rs b/masterror-knowledge/src/errors/ownership/e0381.rs new file mode 100644 index 0000000..8518c29 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0381.rs @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0381: borrow of possibly-uninitialized variable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0381", + title: LocalizedText::new( + "Borrow of possibly-uninitialized variable", + "Заимствование возможно неинициализированной переменной", + "초기화되지 않았을 수 있는 변수의 빌림" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Rust requires all variables to be initialized before use. You're trying +to use a variable that might not have been assigned a value yet. + +This prevents reading garbage memory. The compiler tracks initialization +through all possible code paths.", + "\ +Rust требует инициализации всех переменных перед использованием. +Вы пытаетесь использовать переменную, которая может быть не инициализирована. + +Это предотвращает чтение мусора из памяти.", + "\ +Rust는 사용 전에 모든 변수를 초기화해야 합니다. +아직 값이 할당되지 않았을 수 있는 변수를 사용하려고 합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Initialize the variable", + "Инициализировать переменную", + "변수 초기화" + ), + code: "let x = 0; // or any default value" + }, + FixSuggestion { + description: LocalizedText::new( + "Use Option for maybe-uninitialized", + "Использовать Option для возможно неинициализированных", + "초기화되지 않을 수 있는 경우 Option 사용" + ), + code: "let x: Option = None;\nif condition { x = Some(42); }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0381.html" + }] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0382.rs b/masterror-knowledge/src/errors/ownership/e0382.rs new file mode 100644 index 0000000..f5371d6 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0382.rs @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0382: borrow of moved value + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0382", + title: LocalizedText::new( + "Borrow of moved value", + "Заимствование перемещённого значения", + "이동된 값의 빌림" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +In Rust, each value has exactly one owner at a time. This is the foundation +of Rust's memory safety guarantees without garbage collection. + +When you assign a value to another variable or pass it to a function, +ownership MOVES to the new location. The original variable becomes invalid +and cannot be used anymore. + +This happens because Rust needs to know exactly when to free memory. +With one owner, there's no ambiguity about who is responsible for cleanup.", + "\ +В Rust каждое значение имеет ровно одного владельца. Это основа +гарантий безопасности памяти без сборщика мусора. + +Когда вы присваиваете значение другой переменной или передаёте в функцию, +владение ПЕРЕМЕЩАЕТСЯ. Исходная переменная становится недействительной. + +Rust должен точно знать, когда освобождать память. +С одним владельцем нет неоднозначности в том, кто отвечает за очистку.", + "\ +Rust에서 각 값은 정확히 하나의 소유자를 가집니다. 이것이 가비지 컬렉터 없이 +메모리 안전성을 보장하는 기반입니다. + +값을 다른 변수에 할당하거나 함수에 전달하면 소유권이 새 위치로 이동합니다. +원래 변수는 무효화되어 더 이상 사용할 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Clone the value (creates a deep copy)", + "Клонировать значение (глубокая копия)", + "값을 복제 (깊은 복사)" + ), + code: "let s2 = s.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Borrow with a reference (no copy)", + "Заимствовать по ссылке (без копии)", + "참조로 빌림 (복사 없음)" + ), + code: "let s2 = &s;" + }, + FixSuggestion { + description: LocalizedText::new( + "Implement Copy trait (for small types)", + "Реализовать Copy (для маленьких типов)", + "Copy 트레이트 구현 (작은 타입용)" + ), + code: "#[derive(Copy, Clone)]" + } + ], + links: &[ + DocLink { + title: "Rust Book: Ownership", + url: "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0382.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0383.rs b/masterror-knowledge/src/errors/ownership/e0383.rs new file mode 100644 index 0000000..ebf37f9 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0383.rs @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0383: partial reinitialization of uninitialized structure + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0383", + title: LocalizedText::new( + "Partial reinitialization of uninitialized structure", + "Частичная переинициализация неинициализированной структуры", + "초기화되지 않은 구조체의 부분 재초기화" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to partially reinitialize a struct that was moved from. +After a move, the entire struct is invalid - you can't assign to just +one field. + +You must reinitialize the entire struct.", + "\ +Вы пытаетесь частично переинициализировать структуру после перемещения. +После перемещения вся структура недействительна - нельзя присвоить +только одно поле. + +Нужно переинициализировать всю структуру.", + "\ +이동된 구조체를 부분적으로 재초기화하려고 합니다. +이동 후 전체 구조체가 무효화됩니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Reinitialize the entire struct", + "Переинициализировать всю структуру", + "전체 구조체 재초기화" + ), + code: "s = MyStruct { field1: val1, field2: val2 };" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0383.html" + }] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0384.rs b/masterror-knowledge/src/errors/ownership/e0384.rs new file mode 100644 index 0000000..19696a4 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0384.rs @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0384: cannot assign twice to immutable variable + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0384", + title: LocalizedText::new( + "Cannot assign twice to immutable variable", + "Нельзя присвоить дважды неизменяемой переменной", + "불변 변수에 두 번 할당할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Variables in Rust are immutable by default. Once a value is bound to a name, +you cannot change it unless you explicitly mark it as mutable with `mut`. + +This is a deliberate design choice that makes code easier to reason about. +When you see a variable without `mut`, you know it won't change.", + "\ +Переменные в Rust неизменяемы по умолчанию. После привязки значения +к имени вы не можете его изменить без явного указания `mut`. + +Это осознанное решение, упрощающее понимание кода. +Если переменная без `mut`, она не изменится.", + "\ +Rust의 변수는 기본적으로 불변입니다. 값이 이름에 바인딩되면 +`mut`로 명시적으로 표시하지 않는 한 변경할 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Make the variable mutable", + "Сделать переменную изменяемой", + "변수를 가변으로 만들기" + ), + code: "let mut x = 5;\nx = 10;" + }, + FixSuggestion { + description: LocalizedText::new( + "Use shadowing (create new binding)", + "Использовать затенение (новая привязка)", + "섀도잉 사용 (새 바인딩 생성)" + ), + code: "let x = 5;\nlet x = 10; // shadows the first x" + } + ], + links: &[ + DocLink { + title: "Rust Book: Variables and Mutability", + url: "https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html" + }, + DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0384.html" + } + ] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0505.rs b/masterror-knowledge/src/errors/ownership/e0505.rs new file mode 100644 index 0000000..e76eec9 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0505.rs @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0505: cannot move out of X because it is borrowed + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0505", + title: LocalizedText::new( + "Cannot move out because it is borrowed", + "Нельзя переместить, так как значение заимствовано", + "빌려져 있어서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to move a value while a borrow of it still exists. +This would invalidate the reference, creating a dangling pointer. + +The borrow must end (go out of scope) before you can move the value. + +Rust tracks the lifetime of all borrows to prevent this at compile time.", + "\ +Вы пытаетесь переместить значение, пока существует его заимствование. +Это сделает ссылку недействительной. + +Заимствование должно закончиться до перемещения значения.", + "\ +빌림이 존재하는 동안 값을 이동하려고 합니다. +이것은 참조를 무효화하여 댕글링 포인터를 만듭니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "End the borrow before moving", + "Завершить заимствование перед перемещением", + "이동 전에 빌림 종료" + ), + code: "{ let r = &x; use(r); } // borrow ends\nmove_value(x);" + }, + FixSuggestion { + description: LocalizedText::new( + "Clone before borrowing", + "Клонировать перед заимствованием", + "빌리기 전에 복제" + ), + code: "let cloned = x.clone();\nlet r = &cloned;\nmove_value(x);" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0505.html" + }] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0507.rs b/masterror-knowledge/src/errors/ownership/e0507.rs new file mode 100644 index 0000000..3df095f --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0507.rs @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0507: cannot move out of borrowed content + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0507", + title: LocalizedText::new( + "Cannot move out of borrowed content", + "Нельзя переместить из заимствованного содержимого", + "빌린 내용에서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +You're trying to take ownership of a value that you only have a reference to. +References are borrows - they don't own the data. + +Moving out of a reference would leave the original owner with invalid data, +violating Rust's memory safety guarantees. + +Common cases: +- Indexing into a Vec or array with `vec[i]` and trying to own the element +- Dereferencing a reference and trying to move the value +- Pattern matching on borrowed data with ownership patterns", + "\ +Вы пытаетесь забрать владение значением, на которое у вас только ссылка. +Ссылки - это заимствования, они не владеют данными. + +Перемещение из ссылки оставит исходного владельца с недействительными данными. + +Частые случаи: +- Индексация Vec с попыткой забрать элемент +- Разыменование ссылки с попыткой переместить +- Pattern matching на заимствованных данных", + "\ +참조만 있는 값의 소유권을 가져오려고 합니다. +참조는 빌림입니다 - 데이터를 소유하지 않습니다. + +참조에서 이동하면 원래 소유자가 무효한 데이터를 갖게 됩니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Clone the value", "Клонировать значение", "값 복제"), + code: "let owned = borrowed.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use mem::take or mem::replace", + "Использовать mem::take или mem::replace", + "mem::take 또는 mem::replace 사용" + ), + code: "let owned = std::mem::take(&mut vec[i]);" + }, + FixSuggestion { + description: LocalizedText::new( + "Use swap_remove for Vec", + "Использовать swap_remove для Vec", + "Vec에 swap_remove 사용" + ), + code: "let owned = vec.swap_remove(i);" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0507.html" + }] +}; diff --git a/masterror-knowledge/src/errors/ownership/e0509.rs b/masterror-knowledge/src/errors/ownership/e0509.rs new file mode 100644 index 0000000..4d39ab1 --- /dev/null +++ b/masterror-knowledge/src/errors/ownership/e0509.rs @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! E0509: cannot move out of type X, which implements the Drop trait + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0509", + title: LocalizedText::new( + "Cannot move out of type which implements Drop", + "Нельзя переместить из типа, реализующего Drop", + "Drop을 구현하는 타입에서 이동할 수 없음" + ), + category: Category::Ownership, + explanation: LocalizedText::new( + "\ +Types that implement Drop have custom cleanup logic that runs when they're +destroyed. Moving a field out would leave the struct in a partially valid +state, and Drop wouldn't know what to clean up. + +Rust prevents this to ensure Drop always sees a valid value.", + "\ +Типы с Drop имеют пользовательскую логику очистки при уничтожении. +Перемещение поля оставит структуру в частично валидном состоянии, +и Drop не будет знать, что очищать. + +Rust предотвращает это для гарантии валидности значения в Drop.", + "\ +Drop을 구현하는 타입은 파괴될 때 실행되는 사용자 정의 정리 로직이 있습니다. +필드를 이동하면 구조체가 부분적으로 유효한 상태가 됩니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Clone the field", "Клонировать поле", "필드 복제"), + code: "let field = self.field.clone();" + }, + FixSuggestion { + description: LocalizedText::new( + "Use Option and take()", + "Использовать Option и take()", + "Option과 take() 사용" + ), + code: "struct S { field: Option }\nlet field = self.field.take();" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0509.html" + }] +}; diff --git a/masterror-knowledge/src/errors/raprogramm.rs b/masterror-knowledge/src/errors/raprogramm.rs new file mode 100644 index 0000000..7e81024 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm.rs @@ -0,0 +1,175 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Best practices from RAprogramm's RustManifest. +//! +//! These are not compiler errors but recommendations and patterns +//! from + +mod ra001; +mod ra002; +mod ra003; +mod ra004; +mod ra005; +mod ra006; +mod ra007; +mod ra008; +mod ra009; +mod ra010; +mod ra011; +mod ra012; +mod ra013; +mod ra014; +mod ra015; + +use std::{collections::HashMap, sync::LazyLock}; + +use arrayvec::ArrayString; + +pub use crate::errors::LocalizedText; + +/// Global practice registry singleton. +static PRACTICE_REGISTRY: LazyLock = LazyLock::new(PracticeRegistry::build); + +/// Best practice category. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum PracticeCategory { + ErrorHandling, + Performance, + Naming, + Documentation, + Design, + Testing, + Security +} + +impl PracticeCategory { + pub fn name(&self, lang: &str) -> &'static str { + match (self, lang) { + (Self::ErrorHandling, "ru") => "Обработка ошибок", + (Self::ErrorHandling, "ko") => "오류 처리", + (Self::ErrorHandling, _) => "Error Handling", + + (Self::Performance, "ru") => "Производительность", + (Self::Performance, "ko") => "성능", + (Self::Performance, _) => "Performance", + + (Self::Naming, "ru") => "Именование", + (Self::Naming, "ko") => "명명", + (Self::Naming, _) => "Naming", + + (Self::Documentation, "ru") => "Документация", + (Self::Documentation, "ko") => "문서화", + (Self::Documentation, _) => "Documentation", + + (Self::Design, "ru") => "Проектирование", + (Self::Design, "ko") => "설계", + (Self::Design, _) => "Design", + + (Self::Testing, "ru") => "Тестирование", + (Self::Testing, "ko") => "테스트", + (Self::Testing, _) => "Testing", + + (Self::Security, "ru") => "Безопасность", + (Self::Security, "ko") => "보안", + (Self::Security, _) => "Security" + } + } +} + +/// A best practice recommendation. +#[derive(Debug, Clone)] +pub struct BestPractice { + pub code: &'static str, + pub title: LocalizedText, + pub category: PracticeCategory, + pub explanation: LocalizedText, + pub good_example: &'static str, + pub bad_example: &'static str, + pub source: &'static str +} + +static ENTRIES: &[&BestPractice] = &[ + &ra001::ENTRY, + &ra002::ENTRY, + &ra003::ENTRY, + &ra004::ENTRY, + &ra005::ENTRY, + &ra006::ENTRY, + &ra007::ENTRY, + &ra008::ENTRY, + &ra009::ENTRY, + &ra010::ENTRY, + &ra011::ENTRY, + &ra012::ENTRY, + &ra013::ENTRY, + &ra014::ENTRY, + &ra015::ENTRY +]; + +pub fn entries() -> &'static [&'static BestPractice] { + ENTRIES +} + +/// Registry for best practices. +pub struct PracticeRegistry { + practices: HashMap<&'static str, &'static BestPractice> +} + +impl PracticeRegistry { + /// Get the global registry instance. + pub fn new() -> &'static Self { + &PRACTICE_REGISTRY + } + + /// Build registry from all practices. + fn build() -> Self { + let mut practices = HashMap::with_capacity(15); + for entry in entries() { + practices.insert(entry.code, *entry); + } + Self { + practices + } + } + + /// Find practice by code (RA001, etc.). + /// + /// Accepts formats: "RA001", "ra001". + /// Uses stack-allocated buffer to avoid heap allocation. + pub fn find(&self, code: &str) -> Option<&'static BestPractice> { + // Fast path: try exact match first + if let Some(entry) = self.practices.get(code) { + return Some(*entry); + } + + // Normalize to uppercase using stack buffer + let mut buf: ArrayString<8> = ArrayString::new(); + for c in code.chars().take(8) { + buf.push(c.to_ascii_uppercase()); + } + + self.practices.get(buf.as_str()).copied() + } + + /// Get all practices. + pub fn all(&self) -> impl Iterator + '_ { + self.practices.values().copied() + } + + /// Get practices by category. + pub fn by_category(&self, cat: PracticeCategory) -> Vec<&'static BestPractice> { + self.practices + .values() + .filter(|p| p.category == cat) + .copied() + .collect() + } +} + +impl Default for &'static PracticeRegistry { + fn default() -> Self { + PracticeRegistry::new() + } +} diff --git a/masterror-knowledge/src/errors/raprogramm/ra001.rs b/masterror-knowledge/src/errors/raprogramm/ra001.rs new file mode 100644 index 0000000..774eed4 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra001.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA001: Never use unwrap() in production code + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA001", + title: LocalizedText::new( + "Never use unwrap() in production code", + "Никогда не используйте unwrap() в продакшене", + "프로덕션 코드에서 unwrap() 사용 금지" + ), + category: PracticeCategory::ErrorHandling, + explanation: LocalizedText::new( + "\ +The Cloudflare November 2025 outage affected 330+ datacenters due to a single +.unwrap(). Configuration change exposed an error case that was never handled. +Result: ChatGPT, X, Canva offline for ~3 hours. + +Always use proper error propagation with Result and the ? operator. +Implement detailed error messages with map_err().", + "\ +Сбой Cloudflare в ноябре 2025 затронул 330+ дата-центров из-за одного .unwrap(). +Изменение конфигурации обнажило случай ошибки, который не был обработан. +Результат: ChatGPT, X, Canva недоступны ~3 часа. + +Всегда используйте правильное распространение ошибок с Result и оператором ?.", + "\ +2025년 11월 Cloudflare 장애는 단일 .unwrap()으로 인해 330개 이상의 데이터센터에 +영향을 미쳤습니다. 구성 변경으로 처리되지 않은 오류 케이스가 노출되었습니다." + ), + good_example: r#"let config = Config::from_file("config.toml") + .map_err(|e| format!("Failed to load config: {}", e))?;"#, + bad_example: r#"let config = Config::from_file("config.toml").unwrap();"#, + source: "https://github.com/RAprogramm/RustManifest#6-panic-avoidance-in-production" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra002.rs b/masterror-knowledge/src/errors/raprogramm/ra002.rs new file mode 100644 index 0000000..52c5391 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra002.rs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA002: Use ? operator for error propagation + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA002", + title: LocalizedText::new( + "Use ? operator for error propagation", + "Используйте оператор ? для распространения ошибок", + "오류 전파에 ? 연산자 사용" + ), + category: PracticeCategory::ErrorHandling, + explanation: LocalizedText::new( + "\ +The ? operator is the idiomatic way to handle errors in Rust. +It automatically converts errors and propagates them up the call stack. + +Use ok_or() or ok_or_else() to convert Option to Result with meaningful messages.", + "\ +Оператор ? — идиоматический способ обработки ошибок в Rust. +Он автоматически конвертирует ошибки и распространяет их вверх по стеку вызовов.", + "\ +? 연산자는 Rust에서 오류를 처리하는 관용적인 방법입니다." + ), + good_example: r#"let value = some_option.ok_or("Expected a value")?; +let data = fetch_data().map_err(|e| AppError::Network(e))?;"#, + bad_example: r#"let value = some_option.unwrap(); +let data = fetch_data().expect("fetch failed");"#, + source: "https://github.com/RAprogramm/RustManifest#5-best-practices" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra003.rs b/masterror-knowledge/src/errors/raprogramm/ra003.rs new file mode 100644 index 0000000..14b249c --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra003.rs @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA003: Avoid unnecessary clone() calls + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA003", + title: LocalizedText::new( + "Avoid unnecessary clone() calls", + "Избегайте ненужных вызовов clone()", + "불필요한 clone() 호출 피하기" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +Cloning allocates memory and copies data. Often you can use references instead. +Only clone when you actually need ownership of the data. + +Common anti-patterns: +- Cloning just to satisfy the borrow checker (restructure instead) +- Cloning in a loop (clone once before the loop) +- Cloning when a reference would work", + "\ +Клонирование выделяет память и копирует данные. Часто можно использовать ссылки. +Клонируйте только когда действительно нужно владение данными.", + "\ +클론은 메모리를 할당하고 데이터를 복사합니다. 종종 참조를 대신 사용할 수 있습니다." + ), + good_example: r#"fn process(data: &str) { /* use reference */ } +let owned = expensive_data.clone(); // clone once +for item in &items { process(item); }"#, + bad_example: r#"for item in items { + process(item.clone()); // clones every iteration! +}"#, + source: "https://github.com/RAprogramm/RustManifest#3-code-quality" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra004.rs b/masterror-knowledge/src/errors/raprogramm/ra004.rs new file mode 100644 index 0000000..ab1caae --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra004.rs @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA004: Use descriptive, meaningful names + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA004", + title: LocalizedText::new( + "Use descriptive, meaningful names", + "Используйте описательные, значимые имена", + "설명적이고 의미 있는 이름 사용" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Names must reflect purpose. Avoid generic terms like 'create', 'handle', 'data'. +Descriptive names reduce ambiguity, facilitate easier onboarding, and improve +maintainability. + +Conventions: +- snake_case for variables and functions +- PascalCase for structs and enums +- SCREAMING_SNAKE_CASE for constants", + "\ +Имена должны отражать назначение. Избегайте общих терминов вроде 'create', 'handle', 'data'. +Описательные имена уменьшают неоднозначность и улучшают поддерживаемость.", + "\ +이름은 목적을 반영해야 합니다. 'create', 'handle', 'data' 같은 일반적인 용어를 피하세요." + ), + good_example: r#"fn create_user_handler(req: CreateUserRequest) -> Result +const MAX_RETRY_ATTEMPTS: u32 = 3; +struct UserAuthenticationService { ... }"#, + bad_example: r#"fn create(r: Request) -> Result +const MAX: u32 = 3; +struct Service { ... }"#, + source: "https://github.com/RAprogramm/RustManifest#2-naming-conventions" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra005.rs b/masterror-knowledge/src/errors/raprogramm/ra005.rs new file mode 100644 index 0000000..0087cc2 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra005.rs @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA005: No inline comments - use docblocks only + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA005", + title: LocalizedText::new( + "No inline comments - use docblocks only", + "Никаких инлайн комментариев - только docblocks", + "인라인 주석 금지 - docblock만 사용" + ), + category: PracticeCategory::Documentation, + explanation: LocalizedText::new( + "\ +Avoid // and /* */ explanations in code. All documentation lives in docblocks: +/// for items, //! for modules. + +Standardized headings for IDE/LSP stability: +- # Overview - Short purpose statement +- # Examples - Minimal, compilable samples +- # Errors - Precise failure modes for Result types +- # Panics - Only if unavoidable +- # Safety - Required if unsafe code present", + "\ +Избегайте // и /* */ объяснений в коде. Вся документация живёт в docblocks: +/// для элементов, //! для модулей.", + "\ +코드에서 // 및 /* */ 설명을 피하세요. 모든 문서는 docblock에." + ), + good_example: r#"/// Fetches user data from the database. +/// +/// # Errors +/// Returns `DbError::NotFound` if user doesn't exist. +/// +/// # Examples +/// ``` +/// let user = fetch_user(42)?; +/// ``` +pub fn fetch_user(id: u64) -> Result"#, + bad_example: r#"// This function fetches user data from the database +// It returns an error if user is not found +pub fn fetch_user(id: u64) -> Result"#, + source: "https://github.com/RAprogramm/RustManifest#8-code-documentation" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra006.rs b/masterror-knowledge/src/errors/raprogramm/ra006.rs new file mode 100644 index 0000000..ae7a5e1 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra006.rs @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA006: Entity naming - no -er suffixes + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA006", + title: LocalizedText::new( + "Entity naming: avoid -er, -or, -manager suffixes", + "Именование сущностей: избегайте суффиксов -er, -or, -manager", + "엔티티 명명: -er, -or, -manager 접미사 피하기" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Structures represent entities, not actions. The -er suffix encourages procedural +thinking that separates data from behavior, creating anemic domain models. +Entity naming naturally unifies data and operations. + +Transforms: +- ConfigLoader → Config +- MessageParser → Message +- RequestHandler → Request +- DataValidator → Data +- ConnectionManager → ConnectionPool + +Exceptions: Iterator, Builder, Visitor, Formatter (established patterns).", + "\ +Структуры представляют сущности, не действия. Суффикс -er поощряет процедурное +мышление, разделяющее данные и поведение. Именование сущностей объединяет их.", + "\ +구조체는 동작이 아닌 엔티티를 나타냅니다. -er 접미사는 절차적 사고를 장려합니다." + ), + good_example: r#"struct Config { ... } +struct Message { ... } +struct Request { ... } +struct ConnectionPool { ... }"#, + bad_example: r#"struct ConfigLoader { ... } +struct MessageParser { ... } +struct RequestHandler { ... } +struct ConnectionManager { ... }"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#1-entity-naming" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra007.rs b/masterror-knowledge/src/errors/raprogramm/ra007.rs new file mode 100644 index 0000000..b585557 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra007.rs @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA007: Method naming - nouns for accessors, verbs for mutators + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA007", + title: LocalizedText::new( + "Method naming: nouns for accessors, verbs for mutators", + "Именование методов: существительные для accessors, глаголы для mutators", + "메서드 명명: accessor는 명사, mutator는 동사" + ), + category: PracticeCategory::Naming, + explanation: LocalizedText::new( + "\ +Method names reflect purpose through grammatical form: +- Accessors (nouns): name(), length(), value() — not get_name() +- Predicates (adjectives): empty(), valid(), published() — not is_empty() +- Mutators (verbs): save(), publish(), delete() + +The get_ prefix adds noise without information. Omitting verbs signals pure +accessors. Adjective predicates read more naturally than is_ constructions.", + "\ +Имена методов отражают назначение через грамматическую форму: +- Accessors: name(), length() — не get_name() +- Predicates: empty(), valid() — не is_empty() +- Mutators: save(), publish(), delete()", + "\ +메서드 이름은 문법적 형태로 목적을 반영합니다." + ), + good_example: r#"impl User { + fn name(&self) -> &str { &self.name } + fn empty(&self) -> bool { self.data.is_empty() } + fn save(&mut self) { ... } +}"#, + bad_example: r#"impl User { + fn get_name(&self) -> &str { &self.name } + fn is_empty(&self) -> bool { self.data.is_empty() } +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#2-method-naming" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra008.rs b/masterror-knowledge/src/errors/raprogramm/ra008.rs new file mode 100644 index 0000000..9439153 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra008.rs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA008: Structure size - maximum 4 fields + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA008", + title: LocalizedText::new( + "Structure size: maximum 4 fields", + "Размер структуры: максимум 4 поля", + "구조체 크기: 최대 4개 필드" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +A structure should have no more than 4 fields. More fields indicate multiple +responsibilities requiring composition. + +Problems with large structures: +- Complex testing with many combinations +- Changes ripple through unrelated code +- Purpose becomes unclear +- Parts cannot be reused independently + +Solution: Decompose into focused sub-structures.", + "\ +Структура должна иметь не более 4 полей. Больше полей указывает на +множественные ответственности, требующие композиции.", + "\ +구조체는 4개 이하의 필드를 가져야 합니다. 더 많은 필드는 분해가 필요함을 나타냅니다." + ), + good_example: r#"struct User { + identity: UserIdentity, + credentials: Credentials, + profile: UserProfile, + access: AccessControl, +}"#, + bad_example: r#"struct User { + id: u64, email: String, password_hash: String, + name: String, avatar: Option, bio: String, + created_at: DateTime, updated_at: DateTime, + role: Role, permissions: Vec, + last_login: Option, login_count: u32, + is_verified: bool, verification_token: Option, +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#3-structure-size" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra009.rs b/masterror-knowledge/src/errors/raprogramm/ra009.rs new file mode 100644 index 0000000..91573b8 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra009.rs @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA009: Public API size - maximum 5 methods + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA009", + title: LocalizedText::new( + "Public API size: maximum 5 methods", + "Размер публичного API: максимум 5 методов", + "공개 API 크기: 최대 5개 메서드" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +A structure's public interface should have no more than 5 methods. +More methods signal the structure does too much. + +Large APIs indicate mixed responsibilities, forcing users to understand more, +expanding documentation and testing complexity. + +Solution: Extract secondary concerns into separate types. +Excludes: trait implementations (Display, Debug, From) and generic new().", + "\ +Публичный интерфейс структуры должен иметь не более 5 методов. +Больше методов означает, что структура делает слишком много.", + "\ +구조체의 공개 인터페이스는 5개 이하의 메서드를 가져야 합니다." + ), + good_example: r#"impl Document { + pub fn new() -> Self { ... } + pub fn load(path: &Path) -> Result { ... } + pub fn save(&self) -> Result<()> { ... } + pub fn content(&self) -> &str { ... } + pub fn metadata(&self) -> &Metadata { ... } +} + +// Rendering is separate +impl Renderer { ... } +// Export is separate +impl Exporter { ... }"#, + bad_example: r#"impl Document { + pub fn new() -> Self { ... } + pub fn load() -> Result { ... } + pub fn save() -> Result<()> { ... } + pub fn content(&self) -> &str { ... } + pub fn metadata(&self) -> &Metadata { ... } + pub fn render_html(&self) -> String { ... } + pub fn render_pdf(&self) -> Vec { ... } + pub fn export_json(&self) -> String { ... } + pub fn validate(&self) -> Result<()> { ... } + // ... 10+ more methods +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#4-public-api-size" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra010.rs b/masterror-knowledge/src/errors/raprogramm/ra010.rs new file mode 100644 index 0000000..16397f6 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra010.rs @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA010: Constructors should only assign fields + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA010", + title: LocalizedText::new( + "Constructors: assignment only, no logic", + "Конструкторы: только присваивание, никакой логики", + "생성자: 할당만, 로직 없음" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Constructors should only assign fields. All processing, validation, and I/O +belong in methods. + +Problems with logic in constructors: +- Constructors can fail, complicating object creation +- Work happens eagerly even if unused +- Inflexible creation paths +- Hard to test without real resources + +Benefits of assignment-only constructors: +- Infallible object creation +- Lazy evaluation of expensive work +- Multiple creation paths (from_data() for tests)", + "\ +Конструкторы должны только присваивать поля. Вся обработка, валидация и I/O +принадлежат методам.", + "\ +생성자는 필드만 할당해야 합니다. 모든 처리, 검증, I/O는 메서드에." + ), + good_example: r#"impl Server { + pub fn new(config: Config) -> Self { + Self { config, connection: None } + } + + pub fn connect(&mut self) -> Result<()> { + self.connection = Some(Connection::establish(&self.config)?); + Ok(()) + } +}"#, + bad_example: r#"impl Server { + pub fn new(config: Config) -> Result { + let connection = Connection::establish(&config)?; // I/O in constructor! + validate_config(&config)?; // Logic in constructor! + Ok(Self { config, connection }) + } +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#5-constructor-design" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra011.rs b/masterror-knowledge/src/errors/raprogramm/ra011.rs new file mode 100644 index 0000000..a837c1b --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra011.rs @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA011: Immutability first - prefer self over &mut self + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA011", + title: LocalizedText::new( + "Immutability first: prefer self over &mut self", + "Сначала неизменяемость: предпочитайте self вместо &mut self", + "불변성 우선: &mut self보다 self 선호" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Prefer returning new objects over mutating existing ones. Use `self` instead +of `&mut self` where practical. + +Problems with mutable objects: +- Shared state bugs from unexpected modifications +- Thread safety requires synchronization +- Temporal coupling makes operation order matter +- Incomplete state during configuration + +Exceptions: Large data structures, I/O, performance-critical loops, Iterator::next", + "\ +Предпочитайте возврат новых объектов вместо изменения существующих. +Используйте `self` вместо `&mut self` где возможно.", + "\ +기존 객체를 변경하는 것보다 새 객체를 반환하는 것을 선호하세요." + ), + good_example: r#"Request::new(url) + .header("Content-Type", "application/json") + .body(payload) + .send()"#, + bad_example: r#"let mut req = Request::new(url); +req.set_header("Content-Type", "application/json"); +req.set_body(payload); +req.send()"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#7-immutability-first" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra012.rs b/masterror-knowledge/src/errors/raprogramm/ra012.rs new file mode 100644 index 0000000..8274d8c --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra012.rs @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA012: Constant encapsulation - associate with types + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA012", + title: LocalizedText::new( + "Encapsulate constants in their types", + "Инкапсулируйте константы в их типы", + "상수를 타입에 캡슐화" + ), + category: PracticeCategory::Design, + explanation: LocalizedText::new( + "\ +Constants belong to structures using them, not global scope. This improves +discoverability and prevents namespace pollution. + +Benefits: +- Clear discovery location +- Built-in documentation +- Automatic namespacing +- Encapsulation +- Easy refactoring", + "\ +Константы принадлежат структурам, которые их используют, а не глобальной области. +Это улучшает обнаруживаемость и предотвращает загрязнение пространства имён.", + "\ +상수는 전역 범위가 아닌 사용하는 구조체에 속합니다." + ), + good_example: r#"impl ConnectionPool { + pub const MAX_SIZE: usize = 100; +} + +impl Client { + pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); +} + +// Usage: ConnectionPool::MAX_SIZE"#, + bad_example: r#"const MAX_POOL_SIZE: usize = 100; +const DEFAULT_CLIENT_TIMEOUT: Duration = Duration::from_secs(30); +const MAX_RETRIES: u32 = 3; +const DEFAULT_PORT: u16 = 8080; +// ... scattered constants"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#8-constant-encapsulation" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra013.rs b/masterror-knowledge/src/errors/raprogramm/ra013.rs new file mode 100644 index 0000000..306b810 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra013.rs @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA013: Testing with fakes over mocks + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA013", + title: LocalizedText::new( + "Use fakes over mocks for testing", + "Используйте fakes вместо mocks для тестирования", + "테스트에 mock보다 fake 사용" + ), + category: PracticeCategory::Testing, + explanation: LocalizedText::new( + "\ +Use simple fake implementations instead of mock libraries. Fakes provide real +behavior; mocks verify call sequences. + +| Aspect | Mocks | Fakes | +|--------|-------|-------| +| Coupling | High | Low | +| Maintenance | Breaks on refactoring | Survives changes | +| Behavior | Simulates | Provides real | +| Debugging | Cryptic | Standard | + +Mock appropriateness: Verifying external system interactions, ensuring methods +are NOT called, testing strict interaction ordering.", + "\ +Используйте простые fake-реализации вместо mock-библиотек. Fakes обеспечивают +реальное поведение; mocks проверяют последовательности вызовов.", + "\ +mock 라이브러리 대신 간단한 fake 구현을 사용하세요." + ), + good_example: r#"struct FakeDatabase { + users: HashMap, +} + +impl FakeDatabase { + fn new() -> Self { Self { users: HashMap::new() } } + fn insert(&mut self, user: User) { self.users.insert(user.id, user); } +} + +impl Database for FakeDatabase { + fn find_user(&self, id: u64) -> Option<&User> { + self.users.get(&id) + } +}"#, + bad_example: r#"#[test] +fn test_user_service() { + let mut mock = MockDatabase::new(); + mock.expect_find_user() + .with(eq(42)) + .times(1) + .returning(|_| Some(User::default())); + // Breaks when implementation changes +}"#, + source: "https://github.com/RAprogramm/RustManifest/blob/main/STRUCTURE.md#9-testing-with-fakes" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra014.rs b/masterror-knowledge/src/errors/raprogramm/ra014.rs new file mode 100644 index 0000000..4301b08 --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra014.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA014: Pre-allocate with Vec::with_capacity + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA014", + title: LocalizedText::new( + "Pre-allocate with Vec::with_capacity", + "Предвыделяйте память с Vec::with_capacity", + "Vec::with_capacity로 사전 할당" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +When you know the approximate size of a Vec, pre-allocate to avoid reallocations. +Each reallocation copies all existing elements to new memory. + +This is especially important in hot paths and loops.", + "\ +Когда знаете примерный размер Vec, предвыделяйте чтобы избежать реаллокаций. +Каждая реаллокация копирует все элементы в новую память.", + "\ +Vec의 대략적인 크기를 알 때, 재할당을 피하기 위해 사전 할당하세요." + ), + good_example: r#"let mut results = Vec::with_capacity(items.len()); +for item in items { + results.push(process(item)); +}"#, + bad_example: r#"let mut results = Vec::new(); // starts with 0 capacity +for item in items { + results.push(process(item)); // reallocates multiple times! +}"#, + source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" +}; diff --git a/masterror-knowledge/src/errors/raprogramm/ra015.rs b/masterror-knowledge/src/errors/raprogramm/ra015.rs new file mode 100644 index 0000000..0bfd79c --- /dev/null +++ b/masterror-knowledge/src/errors/raprogramm/ra015.rs @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RA015: Avoid O(n²) algorithms + +use crate::errors::raprogramm::{BestPractice, LocalizedText, PracticeCategory}; + +pub static ENTRY: BestPractice = BestPractice { + code: "RA015", + title: LocalizedText::new( + "Avoid O(n²) algorithms", + "Избегайте алгоритмов O(n²)", + "O(n²) 알고리즘 피하기" + ), + category: PracticeCategory::Performance, + explanation: LocalizedText::new( + "\ +Nested loops over the same data often indicate O(n²) complexity. +Use HashSet/HashMap for lookups, or sort + binary search. + +What looks fine with 100 items becomes unusable with 10,000.", + "\ +Вложенные циклы по одним данным часто указывают на O(n²) сложность. +Используйте HashSet/HashMap для поиска или сортировку + бинарный поиск.", + "\ +같은 데이터에 대한 중첩 루프는 종종 O(n²) 복잡도를 나타냅니다." + ), + good_example: r#"let seen: HashSet<_> = items.iter().collect(); +for item in other_items { + if seen.contains(&item) { // O(1) lookup + // ... + } +}"#, + bad_example: r#"for item in other_items { + for existing in &items { // O(n) for each = O(n²) total + if item == existing { + // ... + } + } +}"#, + source: "https://github.com/RAprogramm/RustManifest#9-code-review-methodology" +}; diff --git a/masterror-knowledge/src/errors/resolution.rs b/masterror-knowledge/src/errors/resolution.rs new file mode 100644 index 0000000..42f17d8 --- /dev/null +++ b/masterror-knowledge/src/errors/resolution.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Name resolution errors. + +mod e0412; +mod e0425; +mod e0433; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0412::ENTRY, &e0425::ENTRY, &e0433::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/resolution/e0412.rs b/masterror-knowledge/src/errors/resolution/e0412.rs new file mode 100644 index 0000000..32a9aa1 --- /dev/null +++ b/masterror-knowledge/src/errors/resolution/e0412.rs @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0412", + title: LocalizedText::new( + "Cannot find type in this scope", + "Не удаётся найти тип в этой области видимости", + "이 스코프에서 타입을 찾을 수 없음" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "The type you're referencing doesn't exist or isn't in scope.", + "Тип, на который вы ссылаетесь, не существует или не в области видимости.", + "참조하는 타입이 존재하지 않거나 스코프에 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new("Import the type", "Импортировать тип", "타입 import"), + code: "use crate::types::MyType;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0412.html" + }] +}; diff --git a/masterror-knowledge/src/errors/resolution/e0425.rs b/masterror-knowledge/src/errors/resolution/e0425.rs new file mode 100644 index 0000000..b973d07 --- /dev/null +++ b/masterror-knowledge/src/errors/resolution/e0425.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0425", + title: LocalizedText::new( + "Cannot find value in this scope", + "Не удаётся найти значение в этой области видимости", + "이 스코프에서 값을 찾을 수 없음" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "You're using a variable, function, or constant that doesn't exist in scope.", + "Вы используете переменную, функцию или константу, которая не существует в текущей области.", + "스코프에 존재하지 않는 변수, 함수 또는 상수를 사용하고 있습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Declare the variable", + "Объявить переменную", + "변수 선언" + ), + code: "let x = 10;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0425.html" + }] +}; diff --git a/masterror-knowledge/src/errors/resolution/e0433.rs b/masterror-knowledge/src/errors/resolution/e0433.rs new file mode 100644 index 0000000..b9e4d19 --- /dev/null +++ b/masterror-knowledge/src/errors/resolution/e0433.rs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0433", + title: LocalizedText::new( + "Failed to resolve: use of undeclared crate or module", + "Не удалось разрешить: необъявленный крейт или модуль", + "해결 실패: 선언되지 않은 크레이트 또는 모듈" + ), + category: Category::Resolution, + explanation: LocalizedText::new( + "Rust can't find the crate, module, or type you're trying to use.", + "Rust не может найти крейт, модуль или тип.", + "Rust가 크레이트, 모듈 또는 타입을 찾을 수 없습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Add use statement", "Добавить use", "use 문 추가"), + code: "use std::collections::HashMap;" + }, + FixSuggestion { + description: LocalizedText::new( + "Add dependency", + "Добавить зависимость", + "의존성 추가" + ), + code: "[dependencies]\nserde = \"1.0\"" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0433.html" + }] +}; diff --git a/masterror-knowledge/src/errors/traits.rs b/masterror-knowledge/src/errors/traits.rs new file mode 100644 index 0000000..d402807 --- /dev/null +++ b/masterror-knowledge/src/errors/traits.rs @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Trait-related errors. + +mod e0038; +mod e0282; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0038::ENTRY, &e0282::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/traits/e0038.rs b/masterror-knowledge/src/errors/traits/e0038.rs new file mode 100644 index 0000000..9055739 --- /dev/null +++ b/masterror-knowledge/src/errors/traits/e0038.rs @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0038", + title: LocalizedText::new( + "Trait cannot be made into an object", + "Трейт не может быть превращён в объект", + "트레이트를 객체로 만들 수 없음" + ), + category: Category::Traits, + explanation: LocalizedText::new( + "This trait is not object-safe - it can't be used as `dyn Trait`.", + "Этот трейт не объектно-безопасен - его нельзя использовать как `dyn Trait`.", + "이 트레이트는 객체 안전하지 않습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new("Use generics", "Использовать обобщения", "제네릭 사용"), + code: "fn process(item: T) { ... }" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0038.html" + }] +}; diff --git a/masterror-knowledge/src/errors/traits/e0282.rs b/masterror-knowledge/src/errors/traits/e0282.rs new file mode 100644 index 0000000..1861285 --- /dev/null +++ b/masterror-knowledge/src/errors/traits/e0282.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0282", + title: LocalizedText::new( + "Type annotations needed", + "Требуются аннотации типа", + "타입 어노테이션이 필요함" + ), + category: Category::Traits, + explanation: LocalizedText::new( + "The compiler cannot infer the type. Provide an explicit type annotation.", + "Компилятор не может вывести тип. Укажите явную аннотацию типа.", + "컴파일러가 타입을 추론할 수 없습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Add type annotation", + "Добавить аннотацию", + "타입 어노테이션 추가" + ), + code: "let numbers: Vec = input.parse().unwrap();" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0282.html" + }] +}; diff --git a/masterror-knowledge/src/errors/types.rs b/masterror-knowledge/src/errors/types.rs new file mode 100644 index 0000000..8cf39da --- /dev/null +++ b/masterror-knowledge/src/errors/types.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Type-related errors. + +mod e0277; +mod e0308; +mod e0599; + +use super::ErrorEntry; + +static ENTRIES: &[&ErrorEntry] = &[&e0277::ENTRY, &e0308::ENTRY, &e0599::ENTRY]; + +pub fn entries() -> &'static [&'static ErrorEntry] { + ENTRIES +} diff --git a/masterror-knowledge/src/errors/types/e0277.rs b/masterror-knowledge/src/errors/types/e0277.rs new file mode 100644 index 0000000..e054ab2 --- /dev/null +++ b/masterror-knowledge/src/errors/types/e0277.rs @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0277", + title: LocalizedText::new( + "Trait bound not satisfied", + "Ограничение трейта не выполнено", + "트레이트 바운드가 충족되지 않음" + ), + category: Category::Types, + explanation: LocalizedText::new( + "A generic function or type requires a trait bound that your type doesn't satisfy.", + "Обобщённая функция или тип требует ограничение трейта, которому ваш тип не удовлетворяет.", + "제네릭 함수나 타입이 당신의 타입이 충족하지 않는 트레이트 바운드를 요구합니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new( + "Derive the trait", + "Получить через derive", + "트레이트 derive" + ), + code: "#[derive(Hash, Eq, PartialEq)]" + }, + FixSuggestion { + description: LocalizedText::new( + "Implement manually", + "Реализовать вручную", + "수동 구현" + ), + code: "impl MyTrait for MyType { ... }" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0277.html" + }] +}; diff --git a/masterror-knowledge/src/errors/types/e0308.rs b/masterror-knowledge/src/errors/types/e0308.rs new file mode 100644 index 0000000..a01246f --- /dev/null +++ b/masterror-knowledge/src/errors/types/e0308.rs @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0308", + title: LocalizedText::new("Mismatched types", "Несовпадение типов", "타입 불일치"), + category: Category::Types, + explanation: LocalizedText::new( + "Rust is statically typed and does NOT perform implicit type conversions.", + "Rust статически типизирован и НЕ выполняет неявные преобразования типов.", + "Rust는 정적 타입 언어이며 암시적 타입 변환을 수행하지 않습니다." + ), + fixes: &[ + FixSuggestion { + description: LocalizedText::new("Use parse()", "Использовать parse()", "parse() 사용"), + code: "let n: i32 = s.parse().unwrap();" + }, + FixSuggestion { + description: LocalizedText::new("Use 'as'", "Использовать 'as'", "'as' 사용"), + code: "let n = x as i32;" + } + ], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0308.html" + }] +}; diff --git a/masterror-knowledge/src/errors/types/e0599.rs b/masterror-knowledge/src/errors/types/e0599.rs new file mode 100644 index 0000000..84a2802 --- /dev/null +++ b/masterror-knowledge/src/errors/types/e0599.rs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +use crate::errors::{Category, DocLink, ErrorEntry, FixSuggestion, LocalizedText}; + +pub static ENTRY: ErrorEntry = ErrorEntry { + code: "E0599", + title: LocalizedText::new( + "No method named X found for type", + "Метод не найден для типа", + "타입에서 메서드를 찾을 수 없음" + ), + category: Category::Types, + explanation: LocalizedText::new( + "You're calling a method that doesn't exist on this type. Check trait imports.", + "Вы вызываете метод, который не существует для этого типа. Проверьте импорт трейтов.", + "이 타입에 존재하지 않는 메서드를 호출하고 있습니다." + ), + fixes: &[FixSuggestion { + description: LocalizedText::new( + "Import the trait", + "Импортировать трейт", + "트레이트 import" + ), + code: "use std::io::Read;" + }], + links: &[DocLink { + title: "Error Code Reference", + url: "https://doc.rust-lang.org/error_codes/E0599.html" + }] +}; diff --git a/masterror-knowledge/src/i18n/messages.rs b/masterror-knowledge/src/i18n/messages.rs new file mode 100644 index 0000000..99ebba6 --- /dev/null +++ b/masterror-knowledge/src/i18n/messages.rs @@ -0,0 +1,206 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! UI messages for masterror-cli. + +use crate::define_messages; + +define_messages! { + pub enum UiMsg { + LabelTranslation { + en: "Translation:", + ru: "Перевод:", + ko: "번역:", + } + LabelWhy { + en: "Why this happens:", + ru: "Почему это происходит:", + ko: "왜 이런 일이 발생하나요:", + } + LabelFix { + en: "How to fix:", + ru: "Как исправить:", + ko: "해결 방법:", + } + LabelLink { + en: "Learn more:", + ru: "Подробнее:", + ko: "더 알아보기:", + } + LabelWhyMatters { + en: "Why this matters:", + ru: "Почему это важно:", + ko: "왜 중요한가:", + } + LabelHowToApply { + en: "How to apply:", + ru: "Как применять:", + ko: "적용 방법:", + } + LabelAvoid { + en: "Avoid", + ru: "Избегайте", + ko: "피하세요", + } + LabelPrefer { + en: "Prefer", + ru: "Предпочитайте", + ko: "선호하세요", + } + + CategoryOwnership { + en: "Ownership", + ru: "Владение", + ko: "소유권", + } + CategoryBorrowing { + en: "Borrowing", + ru: "Заимствование", + ko: "빌림", + } + CategoryLifetimes { + en: "Lifetimes", + ru: "Времена жизни", + ko: "라이프타임", + } + CategoryTypes { + en: "Types", + ru: "Типы", + ko: "타입", + } + CategoryTraits { + en: "Traits", + ru: "Трейты", + ko: "트레이트", + } + CategoryResolution { + en: "Name Resolution", + ru: "Разрешение имён", + ko: "이름 확인", + } + + CategoryErrorHandling { + en: "Error Handling", + ru: "Обработка ошибок", + ko: "에러 처리", + } + CategoryPerformance { + en: "Performance", + ru: "Производительность", + ko: "성능", + } + CategoryNaming { + en: "Naming", + ru: "Именование", + ko: "명명", + } + CategoryDocumentation { + en: "Documentation", + ru: "Документация", + ko: "문서화", + } + CategoryDesign { + en: "Design", + ru: "Дизайн", + ko: "설계", + } + CategoryTesting { + en: "Testing", + ru: "Тестирование", + ko: "테스트", + } + CategorySecurity { + en: "Security", + ru: "Безопасность", + ko: "보안", + } + + UnknownCode { + en: "Unknown code", + ru: "Неизвестный код", + ko: "알 수 없는 코드", + } + Category { + en: "Category", + ru: "Категория", + ko: "카테고리", + } + + InitTitle { + en: "masterror configuration", + ru: "Настройка masterror", + ko: "masterror 설정", + } + InitSuccess { + en: "Configuration saved to", + ru: "Конфигурация сохранена в", + ko: "설정이 저장됨:", + } + InitLangPrompt { + en: "Language", + ru: "Язык", + ko: "언어", + } + InitColorPrompt { + en: "Colored output", + ru: "Цветной вывод", + ko: "색상 출력", + } + InitDisplayPrompt { + en: "Display sections:", + ru: "Секции для отображения:", + ko: "표시 섹션:", + } + InitShowTranslation { + en: "Show translation", + ru: "Показывать перевод", + ko: "번역 표시", + } + InitShowWhy { + en: "Show explanation", + ru: "Показывать объяснение", + ko: "설명 표시", + } + InitShowFix { + en: "Show fix suggestions", + ru: "Показывать исправления", + ko: "수정 제안 표시", + } + InitShowLinks { + en: "Show documentation links", + ru: "Показывать ссылки", + ko: "문서 링크 표시", + } + InitShowOriginal { + en: "Show original compiler output", + ru: "Показывать оригинальный вывод", + ko: "원본 컴파일러 출력 표시", + } + InitSavePrompt { + en: "Where to save configuration?", + ru: "Где сохранить настройки?", + ko: "설정을 어디에 저장할까요?", + } + InitSaveGlobal { + en: "Global (~/.config/masterror/) - applies to all projects", + ru: "Глобально (~/.config/masterror/) - для всех проектов", + ko: "전역 (~/.config/masterror/) - 모든 프로젝트에 적용", + } + InitSaveLocal { + en: "Local (.masterror.toml) - only this project", + ru: "Локально (.masterror.toml) - только этот проект", + ko: "로컬 (.masterror.toml) - 이 프로젝트만", + } + InitTip { + en: "You can change settings anytime by editing:", + ru: "Вы можете изменить настройки в любой момент, отредактировав:", + ko: "언제든지 다음 파일을 편집하여 설정을 변경할 수 있습니다:", + } + InitUsage { + en: "Start using masterror:", + ru: "Начните использовать masterror:", + ko: "masterror 사용 시작:", + } + } +} diff --git a/masterror-knowledge/src/i18n/mod.rs b/masterror-knowledge/src/i18n/mod.rs new file mode 100644 index 0000000..ce97eee --- /dev/null +++ b/masterror-knowledge/src/i18n/mod.rs @@ -0,0 +1,152 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Internationalization system for masterror-cli. +//! +//! Provides compile-time localization with zero runtime allocation. + +pub mod messages; +pub mod phrases; + +/// Supported languages. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] +#[repr(u8)] +pub enum Lang { + /// English (default). + #[default] + En = 0, + /// Russian. + #[cfg(feature = "lang-ru")] + Ru = 1, + /// Korean. + #[cfg(feature = "lang-ko")] + Ko = 2 +} + +impl Lang { + /// Parse language from string, fallback to English. + /// + /// # Examples + /// + /// ``` + /// use masterror::i18n::Lang; + /// + /// assert_eq!(Lang::from_code("ru"), Lang::Ru); + /// assert_eq!(Lang::from_code("unknown"), Lang::En); + /// ``` + pub fn from_code(s: &str) -> Self { + match s { + #[cfg(feature = "lang-ru")] + "ru" | "RU" | "Ru" => Self::Ru, + #[cfg(feature = "lang-ko")] + "ko" | "KO" | "Ko" => Self::Ko, + _ => Self::En + } + } + + /// Get language code as string. + pub const fn code(self) -> &'static str { + match self { + Self::En => "en", + #[cfg(feature = "lang-ru")] + Self::Ru => "ru", + #[cfg(feature = "lang-ko")] + Self::Ko => "ko" + } + } + + /// Get language display name. + pub const fn name(self) -> &'static str { + match self { + Self::En => "English", + #[cfg(feature = "lang-ru")] + Self::Ru => "Русский", + #[cfg(feature = "lang-ko")] + Self::Ko => "한국어" + } + } +} + +/// Define localized messages with compile-time validation. +/// +/// Creates an enum with localized strings accessible via `.get(lang)` method. +/// All strings are `&'static str` with zero runtime allocation. +/// +/// # Example +/// +/// ```ignore +/// define_messages! { +/// pub enum UiMsg { +/// LabelWhy { +/// en: "Why:", +/// ru: "Почему:", +/// ko: "왜:", +/// } +/// } +/// } +/// +/// let msg = UiMsg::LabelWhy.get(Lang::Ru); +/// assert_eq!(msg, "Почему:"); +/// ``` +#[macro_export] +macro_rules! define_messages { + ( + $vis:vis enum $name:ident { + $( + $key:ident { + en: $en:literal + $(, ru: $ru:literal)? + $(, ko: $ko:literal)? + $(,)? + } + )* + } + ) => { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] + #[repr(u16)] + $vis enum $name { + $($key,)* + } + + impl $name { + /// Total number of messages. + pub const COUNT: usize = { + let mut count = 0usize; + $(let _ = stringify!($key); count += 1;)* + count + }; + + /// Get localized string for this message key. + #[inline] + pub const fn get(self, lang: $crate::i18n::Lang) -> &'static str { + match self { + $( + Self::$key => { + match lang { + $crate::i18n::Lang::En => $en, + $( + #[cfg(feature = "lang-ru")] + $crate::i18n::Lang::Ru => $ru, + )? + $( + #[cfg(feature = "lang-ko")] + $crate::i18n::Lang::Ko => $ko, + )? + #[allow(unreachable_patterns)] + _ => $en, + } + } + )* + } + } + + /// Get all message keys as static slice. + pub const fn all() -> &'static [Self] { + &[$(Self::$key,)*] + } + } + }; +} + +pub use define_messages; diff --git a/masterror-knowledge/src/i18n/phrases.rs b/masterror-knowledge/src/i18n/phrases.rs new file mode 100644 index 0000000..f0db428 --- /dev/null +++ b/masterror-knowledge/src/i18n/phrases.rs @@ -0,0 +1,241 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Phrase translations for cargo compiler output. +//! +//! Uses Aho-Corasick algorithm for O(n+m) multi-pattern replacement. + +use std::sync::LazyLock; + +use aho_corasick::AhoCorasick; + +use super::Lang; + +/// Russian phrase translations (sorted alphabetically by English key). +#[cfg(feature = "lang-ru")] +static PHRASES_RU: &[(&str, &str)] = &[ + ("aborting due to", "прерывание из-за"), + ( + "as mutable because it is also borrowed as immutable", + "как изменяемое, т.к. уже заимствовано как неизменяемое" + ), + ( + "as mutable more than once at a time", + "как изменяемое больше одного раза одновременно" + ), + ( + "borrow of moved value", + "заимствование перемещённого значения" + ), + ( + "borrowed value does not live long enough", + "заимствованное значение живёт недостаточно долго" + ), + ("cannot borrow", "нельзя заимствовать"), + ("consider", "рассмотрите"), + ( + "consider cloning the value if the performance cost is acceptable", + "рассмотрите клонирование значения, если допустима потеря производительности" + ), + ("could not compile", "не удалось скомпилировать"), + ("does not live long enough", "живёт недостаточно долго"), + ( + "dropped here while still borrowed", + "удалено здесь, пока ещё заимствовано" + ), + ("due to", "из-за"), + ("error", "ошибка"), + ("expected", "ожидается"), + ( + "expected named lifetime parameter", + "ожидается именованный параметр времени жизни" + ), + ("expected type", "ожидаемый тип"), + ( + "first borrow later used here", + "первое заимствование используется здесь" + ), + ( + "first mutable borrow occurs here", + "первое изменяемое заимствование здесь" + ), + ( + "for more info about this issue", + "для информации об этой ошибке" + ), + ("found", "найдено"), + ("found type", "найденный тип"), + ("has type", "имеет тип"), + ("help", "подсказка"), + ( + "immutable borrow later used here", + "неизменяемое заимствование используется здесь" + ), + ( + "immutable borrow occurs here", + "неизменяемое заимствование здесь" + ), + ("mismatched types", "несовпадение типов"), + ( + "missing lifetime specifier", + "отсутствует спецификатор времени жизни" + ), + ("move occurs because", "перемещение происходит потому что"), + ( + "mutable borrow occurs here", + "изменяемое заимствование здесь" + ), + ("note", "примечание"), + ("previous error", "предыдущей ошибки"), + ("previous errors", "предыдущих ошибок"), + ("run with", "запустите с"), + ( + "second mutable borrow occurs here", + "второе изменяемое заимствование здесь" + ), + ( + "this error originates in the macro", + "эта ошибка возникла в макросе" + ), + ("this expression has type", "это выражение имеет тип"), + ( + "value borrowed here after move", + "значение заимствовано здесь после перемещения" + ), + ("value moved here", "значение перемещено здесь"), + ("warning", "предупреждение"), + ( + "which does not implement the `Copy` trait", + "который не реализует трейт `Copy`" + ) +]; + +/// Korean phrase translations (sorted alphabetically by English key). +#[cfg(feature = "lang-ko")] +static PHRASES_KO: &[(&str, &str)] = &[ + ("borrow of moved value", "이동된 값의 빌림"), + ("cannot borrow", "빌릴 수 없습니다"), + ("error", "에러"), + ("help", "도움말"), + ("mismatched types", "타입 불일치"), + ("note", "참고"), + ("warning", "경고") +]; + +/// Pre-built Aho-Corasick automaton for Russian translations. +/// +/// Patterns are sorted by length (longest first) to ensure correct replacement +/// when shorter patterns are substrings of longer ones. +#[cfg(feature = "lang-ru")] +static AC_RU: LazyLock<(AhoCorasick, Vec<&'static str>)> = LazyLock::new(|| { + let mut sorted: Vec<_> = PHRASES_RU.iter().collect(); + sorted.sort_by(|a, b| b.0.len().cmp(&a.0.len())); + + let patterns: Vec<_> = sorted.iter().map(|(k, _)| *k).collect(); + let replacements: Vec<_> = sorted.iter().map(|(_, v)| *v).collect(); + + let ac = AhoCorasick::new(&patterns).expect("valid patterns"); + (ac, replacements) +}); + +/// Pre-built Aho-Corasick automaton for Korean translations. +#[cfg(feature = "lang-ko")] +static AC_KO: LazyLock<(AhoCorasick, Vec<&'static str>)> = LazyLock::new(|| { + let mut sorted: Vec<_> = PHRASES_KO.iter().collect(); + sorted.sort_by(|a, b| b.0.len().cmp(&a.0.len())); + + let patterns: Vec<_> = sorted.iter().map(|(k, _)| *k).collect(); + let replacements: Vec<_> = sorted.iter().map(|(_, v)| *v).collect(); + + let ac = AhoCorasick::new(&patterns).expect("valid patterns"); + (ac, replacements) +}); + +/// Translate a phrase to the target language. +/// +/// Returns `None` if no translation exists or language is English. +pub fn translate_phrase(phrase: &str, lang: Lang) -> Option<&'static str> { + let phrases: &[(&str, &str)] = match lang { + Lang::En => return None, + #[cfg(feature = "lang-ru")] + Lang::Ru => PHRASES_RU, + #[cfg(feature = "lang-ko")] + Lang::Ko => PHRASES_KO, + #[allow(unreachable_patterns)] + _ => return None + }; + + phrases + .binary_search_by_key(&phrase, |(k, _)| *k) + .ok() + .map(|i| phrases[i].1) +} + +/// Translate full rendered compiler output. +/// +/// Uses pre-built Aho-Corasick automaton for O(n+m) replacement +/// instead of O(n*m) naive string replacement. +pub fn translate_rendered(rendered: &str, lang: Lang) -> String { + match lang { + Lang::En => rendered.to_string(), + #[cfg(feature = "lang-ru")] + Lang::Ru => { + let (ac, replacements) = &*AC_RU; + ac.replace_all(rendered, replacements) + } + #[cfg(feature = "lang-ko")] + Lang::Ko => { + let (ac, replacements) = &*AC_KO; + ac.replace_all(rendered, replacements) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[cfg(feature = "lang-ru")] + fn test_translate_phrase_ru() { + assert_eq!( + translate_phrase("borrow of moved value", Lang::Ru), + Some("заимствование перемещённого значения") + ); + assert_eq!(translate_phrase("unknown phrase", Lang::Ru), None); + } + + #[test] + fn test_translate_phrase_en() { + assert_eq!(translate_phrase("borrow of moved value", Lang::En), None); + } + + #[test] + #[cfg(feature = "lang-ru")] + fn test_phrases_sorted() { + for window in PHRASES_RU.windows(2) { + assert!( + window[0].0 < window[1].0, + "Phrases not sorted: {:?} should come before {:?}", + window[1].0, + window[0].0 + ); + } + } + + #[test] + #[cfg(feature = "lang-ru")] + fn test_translate_rendered_ru() { + let input = "error: borrow of moved value"; + let output = translate_rendered(input, Lang::Ru); + assert_eq!(output, "ошибка: заимствование перемещённого значения"); + } + + #[test] + fn test_translate_rendered_en_passthrough() { + let input = "error: borrow of moved value"; + let output = translate_rendered(input, Lang::En); + assert_eq!(output, input); + } +} diff --git a/masterror-knowledge/src/lib.rs b/masterror-knowledge/src/lib.rs new file mode 100644 index 0000000..3ac7174 --- /dev/null +++ b/masterror-knowledge/src/lib.rs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Knowledge base for Rust compiler errors and best practices. +//! +//! This crate provides structured explanations for Rust compiler errors +//! with translations (en/ru/ko) and actionable fix suggestions. +//! +//! # Example +//! +//! ```rust,ignore +//! use masterror_knowledge::{ErrorRegistry, PracticeRegistry}; +//! +//! let registry = ErrorRegistry::new(); +//! if let Some(entry) = registry.find("E0502") { +//! println!("Error: {}", entry.title.en); +//! println!("Explanation: {}", entry.explanation.en); +//! } +//! +//! let practices = PracticeRegistry::new(); +//! if let Some(practice) = practices.find("RA001") { +//! println!("Practice: {}", practice.title.en); +//! } +//! ``` + +pub mod errors; +pub mod i18n; + +pub use errors::{ + Category, DocLink, ErrorEntry, ErrorRegistry, FixSuggestion, LocalizedText, + raprogramm::{BestPractice, PracticeCategory, PracticeRegistry} +}; +pub use i18n::{Lang, messages::UiMsg, phrases}; diff --git a/src/lib.rs b/src/lib.rs index 5459dd7..8475c54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -371,6 +371,14 @@ pub mod turnkey; #[cfg_attr(docsrs, doc(cfg(feature = "colored")))] pub mod colored; +/// Rust compiler error explanations and best practices. +/// +/// Provides structured knowledge base for understanding compiler errors +/// with translations (en/ru/ko) and actionable fix suggestions. +#[cfg(feature = "knowledge")] +#[cfg_attr(docsrs, doc(cfg(feature = "knowledge")))] +pub use masterror_knowledge as knowledge; + /// Minimal prelude re-exporting core types for handler signatures. pub mod prelude; From 9851b375b3ed0723cf0e5d8e5dbe6f32b1a3bfc5 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 11:58:09 +0700 Subject: [PATCH 10/16] ci: add dependency-aware change detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add changes job with dorny/paths-filter for file change detection - Compute dependency graph: template→derive→masterror, knowledge→cli - Skip jobs when no relevant changes detected - Add masterror-knowledge and masterror-cli to CRATES publish list - Update release workflow to use $CRATES variable - Fix no-std tests to only check masterror crate - Add Step Summary with change detection table - Fix rustdoc warning for private InlineVec link --- .github/workflows/ci.yml | 266 +++++++++++++++++++++++++++++++---- Cargo.toml | 1 + masterror-cli/Cargo.toml | 2 +- src/app_error/diagnostics.rs | 2 +- 4 files changed, 243 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9081435..a69bf52 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,8 @@ env: RUST_BACKTRACE: short RUSTFLAGS: -D warnings # Crate publish order (dependencies first) - CRATES: "masterror-template masterror-derive masterror" + # template → derive → knowledge → masterror → cli + CRATES: "masterror-template masterror-derive masterror-knowledge masterror masterror-cli" jobs: # ════════════════════════════════════════════════════════════════════════════ @@ -58,13 +59,160 @@ jobs: echo "version=$MSRV" >> "$GITHUB_OUTPUT" echo "MSRV: $MSRV" + # ════════════════════════════════════════════════════════════════════════════ + # Detect changed crates (dependency-aware) + # ════════════════════════════════════════════════════════════════════════════ + + changes: + name: Detect Changes + runs-on: ubuntu-latest + outputs: + # Individual crate changes + template: ${{ steps.filter.outputs.template }} + derive: ${{ steps.filter.outputs.derive }} + knowledge: ${{ steps.filter.outputs.knowledge }} + masterror: ${{ steps.filter.outputs.masterror }} + cli: ${{ steps.filter.outputs.cli }} + # Dependency-aware: need to rebuild these + need-template: ${{ steps.deps.outputs.need-template }} + need-derive: ${{ steps.deps.outputs.need-derive }} + need-knowledge: ${{ steps.deps.outputs.need-knowledge }} + need-masterror: ${{ steps.deps.outputs.need-masterror }} + need-cli: ${{ steps.deps.outputs.need-cli }} + # Any library changed (for full workspace checks) + any-lib: ${{ steps.deps.outputs.any-lib }} + # CI/config changed (force full rebuild) + ci: ${{ steps.filter.outputs.ci }} + steps: + - uses: actions/checkout@v5 + + - name: Detect file changes + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + template: + - 'masterror-template/**' + derive: + - 'masterror-derive/**' + knowledge: + - 'masterror-knowledge/**' + masterror: + - 'src/**' + - 'Cargo.toml' + - 'build.rs' + cli: + - 'masterror-cli/**' + ci: + - '.github/workflows/**' + - 'Cargo.lock' + - 'deny.toml' + - 'cliff.toml' + - '.cargo/**' + + - name: Compute dependency graph + id: deps + run: | + # Dependency graph: + # template ← derive ← masterror + # ↗ + # knowledge ← cli + # ↘ masterror (optional feature) + + TEMPLATE="${{ steps.filter.outputs.template }}" + DERIVE="${{ steps.filter.outputs.derive }}" + KNOWLEDGE="${{ steps.filter.outputs.knowledge }}" + MASTERROR="${{ steps.filter.outputs.masterror }}" + CLI="${{ steps.filter.outputs.cli }}" + CI="${{ steps.filter.outputs.ci }}" + + # Force all if CI config changed or workflow_dispatch + if [[ "$CI" == "true" ]] || [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "CI config changed or manual trigger - rebuilding all" + echo "need-template=true" >> "$GITHUB_OUTPUT" + echo "need-derive=true" >> "$GITHUB_OUTPUT" + echo "need-knowledge=true" >> "$GITHUB_OUTPUT" + echo "need-masterror=true" >> "$GITHUB_OUTPUT" + echo "need-cli=true" >> "$GITHUB_OUTPUT" + echo "any-lib=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # template: standalone + NEED_TEMPLATE="$TEMPLATE" + + # derive: depends on template + if [[ "$DERIVE" == "true" ]] || [[ "$TEMPLATE" == "true" ]]; then + NEED_DERIVE=true + else + NEED_DERIVE=false + fi + + # knowledge: standalone + NEED_KNOWLEDGE="$KNOWLEDGE" + + # masterror: depends on template, derive, optionally knowledge + if [[ "$MASTERROR" == "true" ]] || [[ "$TEMPLATE" == "true" ]] || \ + [[ "$DERIVE" == "true" ]] || [[ "$KNOWLEDGE" == "true" ]]; then + NEED_MASTERROR=true + else + NEED_MASTERROR=false + fi + + # cli: depends on knowledge + if [[ "$CLI" == "true" ]] || [[ "$KNOWLEDGE" == "true" ]]; then + NEED_CLI=true + else + NEED_CLI=false + fi + + # Any library changed? + if [[ "$NEED_TEMPLATE" == "true" ]] || [[ "$NEED_DERIVE" == "true" ]] || \ + [[ "$NEED_KNOWLEDGE" == "true" ]] || [[ "$NEED_MASTERROR" == "true" ]] || \ + [[ "$NEED_CLI" == "true" ]]; then + ANY_LIB=true + else + ANY_LIB=false + fi + + echo "need-template=$NEED_TEMPLATE" >> "$GITHUB_OUTPUT" + echo "need-derive=$NEED_DERIVE" >> "$GITHUB_OUTPUT" + echo "need-knowledge=$NEED_KNOWLEDGE" >> "$GITHUB_OUTPUT" + echo "need-masterror=$NEED_MASTERROR" >> "$GITHUB_OUTPUT" + echo "need-cli=$NEED_CLI" >> "$GITHUB_OUTPUT" + echo "any-lib=$ANY_LIB" >> "$GITHUB_OUTPUT" + + echo "Summary:" + echo " template: $TEMPLATE → need: $NEED_TEMPLATE" + echo " derive: $DERIVE → need: $NEED_DERIVE" + echo " knowledge: $KNOWLEDGE → need: $NEED_KNOWLEDGE" + echo " masterror: $MASTERROR → need: $NEED_MASTERROR" + echo " cli: $CLI → need: $NEED_CLI" + echo " any-lib: $ANY_LIB" + + # GitHub Step Summary + cat >> $GITHUB_STEP_SUMMARY << EOF + ## 🔍 Change Detection + + | Crate | Changed | Rebuild | + |-------|---------|---------| + | masterror-template | $([[ "$TEMPLATE" == "true" ]] && echo "✅" || echo "—") | $([[ "$NEED_TEMPLATE" == "true" ]] && echo "🔨" || echo "⏭️") | + | masterror-derive | $([[ "$DERIVE" == "true" ]] && echo "✅" || echo "—") | $([[ "$NEED_DERIVE" == "true" ]] && echo "🔨" || echo "⏭️") | + | masterror-knowledge | $([[ "$KNOWLEDGE" == "true" ]] && echo "✅" || echo "—") | $([[ "$NEED_KNOWLEDGE" == "true" ]] && echo "🔨" || echo "⏭️") | + | masterror | $([[ "$MASTERROR" == "true" ]] && echo "✅" || echo "—") | $([[ "$NEED_MASTERROR" == "true" ]] && echo "🔨" || echo "⏭️") | + | masterror-cli | $([[ "$CLI" == "true" ]] && echo "✅" || echo "—") | $([[ "$NEED_CLI" == "true" ]] && echo "🔨" || echo "⏭️") | + + **Legend:** ✅ = changed, 🔨 = will rebuild, ⏭️ = skipped, — = no changes + EOF + # ════════════════════════════════════════════════════════════════════════════ # STAGE 1: CHECKS (parallel matrix) # ════════════════════════════════════════════════════════════════════════════ check: name: Check (${{ matrix.rust }} / ${{ matrix.os }}) - needs: msrv + needs: [msrv, changes] + if: needs.changes.outputs.any-lib == 'true' runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -124,6 +272,8 @@ jobs: fmt: name: Format + needs: changes + if: needs.changes.outputs.any-lib == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -138,6 +288,8 @@ jobs: docs: name: Documentation + needs: changes + if: needs.changes.outputs.any-lib == 'true' runs-on: ubuntu-latest env: RUSTDOCFLAGS: -D warnings @@ -155,6 +307,8 @@ jobs: no-std: name: no_std (${{ matrix.name }}) + needs: changes + if: needs.changes.outputs.need-masterror == 'true' runs-on: ubuntu-latest strategy: fail-fast: false @@ -185,7 +339,7 @@ jobs: save-if: ${{ github.ref == 'refs/heads/main' }} - name: Check ${{ matrix.name }} - run: cargo check ${{ matrix.args }} + run: cargo check -p masterror ${{ matrix.args }} security: name: Security Audit @@ -225,8 +379,16 @@ jobs: test: name: Test Suite - needs: [check, fmt, no-std, security, reuse] - if: ${{ !inputs.skip_tests }} + needs: [changes, check, fmt, no-std, security, reuse] + if: | + always() && + !inputs.skip_tests && + needs.changes.outputs.any-lib == 'true' && + (needs.check.result == 'success' || needs.check.result == 'skipped') && + (needs.fmt.result == 'success' || needs.fmt.result == 'skipped') && + (needs['no-std'].result == 'success' || needs['no-std'].result == 'skipped') && + needs.security.result == 'success' && + needs.reuse.result == 'success' runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -262,7 +424,11 @@ jobs: coverage: name: Coverage - needs: test + needs: [changes, test] + if: | + always() && + needs.changes.outputs.any-lib == 'true' && + needs.test.result == 'success' runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -309,9 +475,13 @@ jobs: benchmarks: name: Benchmarks - needs: test + needs: [changes, test] runs-on: ubuntu-latest - if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main' + if: | + always() && + needs.changes.outputs.need-masterror == 'true' && + needs.test.result == 'success' && + (github.event_name == 'pull_request' || github.ref == 'refs/heads/main') steps: - uses: actions/checkout@v5 @@ -340,12 +510,18 @@ jobs: changelog: name: Update Changelog - needs: [check, fmt, no-std, security, reuse] + needs: [changes, check, fmt, no-std, security, reuse] runs-on: ubuntu-latest if: | + always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && - !contains(github.event.head_commit.message || '', '[skip ci]') + !contains(github.event.head_commit.message || '', '[skip ci]') && + (needs.check.result == 'success' || needs.check.result == 'skipped') && + (needs.fmt.result == 'success' || needs.fmt.result == 'skipped') && + (needs['no-std'].result == 'success' || needs['no-std'].result == 'skipped') && + needs.security.result == 'success' && + needs.reuse.result == 'success' steps: - uses: actions/checkout@v5 with: @@ -412,10 +588,12 @@ jobs: release: name: Release - needs: [test, changelog] + needs: [changes, test, changelog] if: | always() && + needs.changes.outputs.any-lib == 'true' && (needs.test.result == 'success' || needs.test.result == 'skipped') && + (needs.changelog.result == 'success' || needs.changelog.result == 'skipped') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message || '', '[skip ci]') @@ -508,7 +686,7 @@ jobs: declare -A LOCAL REMOTE NEEDS_PUBLISH PUBLISHED_ANY=false - for crate in masterror-template masterror-derive masterror; do + for crate in $CRATES; do LOCAL[$crate]=$(get_local_version "$crate") REMOTE[$crate]=$(get_remote_version "$crate") @@ -527,16 +705,21 @@ jobs: # Dependency-aware publishing # ══════════════════════════════════════════════════════════════════ - # If derive changes, masterror should also be republished - # (it depends on derive, users need consistent versions) + # Dependency consistency warnings if [[ "${NEEDS_PUBLISH[masterror-derive]}" == "true" ]] && \ [[ "${NEEDS_PUBLISH[masterror]}" == "false" ]]; then warn "masterror-derive changed but masterror version unchanged" warn "Consider bumping masterror version for dependency consistency" fi - # Publish in order: template → derive → masterror - for crate in masterror-template masterror-derive masterror; do + if [[ "${NEEDS_PUBLISH[masterror-knowledge]}" == "true" ]] && \ + [[ "${NEEDS_PUBLISH[masterror-cli]}" == "false" ]]; then + warn "masterror-knowledge changed but masterror-cli version unchanged" + warn "Consider bumping masterror-cli version for dependency consistency" + fi + + # Publish in order: template → derive → knowledge → masterror → cli + for crate in $CRATES; do if [[ "${NEEDS_PUBLISH[$crate]}" == "true" ]]; then if publish_crate "$crate"; then PUBLISHED_ANY=true @@ -605,7 +788,9 @@ jobs: |-------|--------| | masterror-template | ${{ steps.publish.outputs.published == 'true' && '✅ Published' || '⏭️ Skipped' }} | | masterror-derive | ${{ steps.publish.outputs.published == 'true' && '✅ Published' || '⏭️ Skipped' }} | + | masterror-knowledge | ${{ steps.publish.outputs.published == 'true' && '✅ Published' || '⏭️ Skipped' }} | | masterror | ${{ steps.publish.outputs.published == 'true' && '✅ Published' || '⏭️ Skipped' }} | + | masterror-cli | ${{ steps.publish.outputs.published == 'true' && '✅ Published' || '⏭️ Skipped' }} | **Version:** `${{ steps.publish.outputs.version }}` EOF @@ -681,19 +866,48 @@ jobs: ci-success: name: CI Success - needs: [check, fmt, docs, no-std, security, reuse, test] + needs: [changes, check, fmt, docs, no-std, security, reuse, test] if: always() runs-on: ubuntu-latest steps: - name: Check all jobs run: | - results="${{ needs.check.result }} ${{ needs.fmt.result }} ${{ needs.docs.result }} ${{ needs.no-std.result }} ${{ needs.security.result }} ${{ needs.reuse.result }} ${{ needs.test.result }}" - - for r in $results; do - if [[ "$r" == "failure" ]]; then - echo "::error::One or more required jobs failed" - exit 1 - fi - done + echo "Job results:" + echo " changes: ${{ needs.changes.result }}" + echo " check: ${{ needs.check.result }}" + echo " fmt: ${{ needs.fmt.result }}" + echo " docs: ${{ needs.docs.result }}" + echo " no-std: ${{ needs['no-std'].result }}" + echo " security: ${{ needs.security.result }}" + echo " reuse: ${{ needs.reuse.result }}" + echo " test: ${{ needs.test.result }}" + + FAILED=false + + # Changes detection must succeed + [[ "${{ needs.changes.result }}" != "success" ]] && \ + echo "::error::Changes detection failed" && FAILED=true + + # Security and REUSE must always pass + [[ "${{ needs.security.result }}" == "failure" ]] && \ + echo "::error::Security audit failed" && FAILED=true + [[ "${{ needs.reuse.result }}" == "failure" ]] && \ + echo "::error::REUSE compliance failed" && FAILED=true + + # Other jobs: failure is not OK (skipped is fine) + [[ "${{ needs.check.result }}" == "failure" ]] && \ + echo "::error::Check job failed" && FAILED=true + [[ "${{ needs.fmt.result }}" == "failure" ]] && \ + echo "::error::Format job failed" && FAILED=true + [[ "${{ needs.docs.result }}" == "failure" ]] && \ + echo "::error::Docs job failed" && FAILED=true + [[ "${{ needs['no-std'].result }}" == "failure" ]] && \ + echo "::error::no-std job failed" && FAILED=true + [[ "${{ needs.test.result }}" == "failure" ]] && \ + echo "::error::Test job failed" && FAILED=true + + if [[ "$FAILED" == "true" ]]; then + exit 1 + fi - echo "✅ All CI checks passed!" + echo "✅ All CI checks passed (some may have been skipped due to no changes)" diff --git a/Cargo.toml b/Cargo.toml index e0f6bd2..0e69956 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,7 @@ knowledge = ["dep:masterror-knowledge"] [workspace.dependencies] masterror-derive = { version = "0.11" } masterror-template = { version = "0.4" } +masterror-knowledge = { version = "0.1" } [dependencies] masterror-derive = { version = "0.11" } diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml index 89b54b4..3fb888a 100644 --- a/masterror-cli/Cargo.toml +++ b/masterror-cli/Cargo.toml @@ -34,7 +34,7 @@ show-translation = [] show-original = [] [dependencies] -masterror-knowledge = { path = "../masterror-knowledge" } +masterror-knowledge = { version = "0.1", path = "../masterror-knowledge" } # CLI framework clap = { version = "4", features = ["derive", "env", "wrap_help"] } diff --git a/src/app_error/diagnostics.rs b/src/app_error/diagnostics.rs index 53fb166..69a31d1 100644 --- a/src/app_error/diagnostics.rs +++ b/src/app_error/diagnostics.rs @@ -271,7 +271,7 @@ impl DocLink { /// /// # Memory Layout /// -/// The structure uses [`InlineVec`] for hints and suggestions, which stores +/// The structure uses `InlineVec` for hints and suggestions, which stores /// up to 4 elements inline without heap allocation. This optimizes for the /// common case of 1-2 hints/suggestions per error. /// From 98d59c74efbf07cd97df4aefc8b9f9b9ac7c5355 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 12:13:05 +0700 Subject: [PATCH 11/16] refactor(core): split builder.rs into modular structure - constructors.rs: new, with, bare - modifiers.rs: with_code, with_retry_after_secs, with_www_authenticate, redactable - metadata.rs: with_field, with_fields, redact_field, with_metadata - context.rs: with_context, with_source, with_source_arc, with_backtrace - details.rs: with_details_json, with_details, with_details_text - diagnostics.rs: with_hint, with_suggestion, with_docs, with_related_code - tests.rs: comprehensive tests for all builder methods (42 tests) Also fix doctest in masterror-knowledge using correct crate name --- masterror-knowledge/src/i18n/mod.rs | 2 +- src/app_error/core/builder.rs | 611 --------------------- src/app_error/core/builder/constructors.rs | 65 +++ src/app_error/core/builder/context.rs | 134 +++++ src/app_error/core/builder/details.rs | 103 ++++ src/app_error/core/builder/diagnostics.rs | 197 +++++++ src/app_error/core/builder/metadata.rs | 84 +++ src/app_error/core/builder/mod.rs | 18 + src/app_error/core/builder/modifiers.rs | 84 +++ src/app_error/core/builder/tests.rs | 428 +++++++++++++++ 10 files changed, 1114 insertions(+), 612 deletions(-) delete mode 100644 src/app_error/core/builder.rs create mode 100644 src/app_error/core/builder/constructors.rs create mode 100644 src/app_error/core/builder/context.rs create mode 100644 src/app_error/core/builder/details.rs create mode 100644 src/app_error/core/builder/diagnostics.rs create mode 100644 src/app_error/core/builder/metadata.rs create mode 100644 src/app_error/core/builder/mod.rs create mode 100644 src/app_error/core/builder/modifiers.rs create mode 100644 src/app_error/core/builder/tests.rs diff --git a/masterror-knowledge/src/i18n/mod.rs b/masterror-knowledge/src/i18n/mod.rs index ce97eee..a7c6afc 100644 --- a/masterror-knowledge/src/i18n/mod.rs +++ b/masterror-knowledge/src/i18n/mod.rs @@ -30,7 +30,7 @@ impl Lang { /// # Examples /// /// ``` - /// use masterror::i18n::Lang; + /// use masterror_knowledge::Lang; /// /// assert_eq!(Lang::from_code("ru"), Lang::Ru); /// assert_eq!(Lang::from_code("unknown"), Lang::En); diff --git a/src/app_error/core/builder.rs b/src/app_error/core/builder.rs deleted file mode 100644 index c909acc..0000000 --- a/src/app_error/core/builder.rs +++ /dev/null @@ -1,611 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use alloc::{borrow::Cow, boxed::Box, string::String, sync::Arc}; -use core::error::Error as CoreError; -#[cfg(feature = "backtrace")] -use std::backtrace::Backtrace; - -#[cfg(feature = "serde_json")] -use serde::Serialize; -#[cfg(feature = "serde_json")] -use serde_json::{Value as JsonValue, to_value}; - -use super::{ - error::Error, - types::{CapturedBacktrace, ContextAttachment, MessageEditPolicy} -}; -use crate::{ - AppCode, AppErrorKind, RetryAdvice, - app_error::metadata::{Field, FieldRedaction, Metadata} -}; - -impl Error { - /// Create a new [`Error`] with a kind and message. - /// - /// This is equivalent to [`Error::with`], provided for API symmetry and to - /// keep doctests readable. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind}; - /// let err = AppError::new(AppErrorKind::BadRequest, "invalid payload"); - /// assert!(err.message.is_some()); - /// ``` - #[must_use] - pub fn new(kind: AppErrorKind, msg: impl Into>) -> Self { - Self::with(kind, msg) - } - - /// Create an error with the given kind and message. - /// - /// Prefer named helpers (e.g. [`Error::not_found`]) where it clarifies - /// intent. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind}; - /// let err = AppError::with(AppErrorKind::Validation, "bad input"); - /// assert_eq!(err.kind, AppErrorKind::Validation); - /// ``` - #[must_use] - pub fn with(kind: AppErrorKind, msg: impl Into>) -> Self { - let err = Self::new_raw(kind, Some(msg.into())); - err.emit_telemetry(); - err - } - - /// Create a message-less error with the given kind. - /// - /// Useful when the kind alone conveys sufficient information to the client. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind}; - /// let err = AppError::bare(AppErrorKind::NotFound); - /// assert!(err.message.is_none()); - /// ``` - #[must_use] - pub fn bare(kind: AppErrorKind) -> Self { - let err = Self::new_raw(kind, None); - err.emit_telemetry(); - err - } - - /// Override the machine-readable [`AppCode`]. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppCode, AppError, AppErrorKind}; - /// let err = AppError::new(AppErrorKind::BadRequest, "test").with_code(AppCode::NotFound); - /// assert_eq!(err.code, AppCode::NotFound); - /// ``` - #[must_use] - pub fn with_code(mut self, code: AppCode) -> Self { - self.code = code; - self.mark_dirty(); - self - } - - /// Attach retry advice to the error. - /// - /// When mapped to HTTP, this becomes the `Retry-After` header. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind}; - /// let err = AppError::new(AppErrorKind::RateLimited, "slow down").with_retry_after_secs(60); - /// assert_eq!(err.retry.map(|r| r.after_seconds), Some(60)); - /// ``` - #[must_use] - pub fn with_retry_after_secs(mut self, secs: u64) -> Self { - self.retry = Some(RetryAdvice { - after_seconds: secs - }); - self.mark_dirty(); - self - } - - /// Attach a `WWW-Authenticate` challenge string. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind}; - /// let err = AppError::new(AppErrorKind::Unauthorized, "auth required") - /// .with_www_authenticate("Bearer realm=\"api\""); - /// assert!(err.www_authenticate.is_some()); - /// ``` - #[must_use] - pub fn with_www_authenticate(mut self, value: impl Into) -> Self { - self.www_authenticate = Some(value.into()); - self.mark_dirty(); - self - } - - /// Attach additional metadata to the error. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind, field}; - /// let err = AppError::new(AppErrorKind::Validation, "bad field") - /// .with_field(field::str("field_name", "email")); - /// assert!(err.metadata().get("field_name").is_some()); - /// ``` - #[must_use] - pub fn with_field(mut self, field: Field) -> Self { - self.metadata.insert(field); - self.mark_dirty(); - self - } - - /// Extend metadata from an iterator of fields. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind, field}; - /// let fields = vec![field::str("key1", "value1"), field::str("key2", "value2")]; - /// let err = AppError::new(AppErrorKind::BadRequest, "test").with_fields(fields); - /// assert!(err.metadata().get("key1").is_some()); - /// ``` - #[must_use] - pub fn with_fields(mut self, fields: impl IntoIterator) -> Self { - self.metadata.extend(fields); - self.mark_dirty(); - self - } - - /// Override the redaction policy for a stored metadata field. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind, FieldRedaction, field}; - /// - /// let err = AppError::new(AppErrorKind::Internal, "test") - /// .with_field(field::str("password", "secret")) - /// .redact_field("password", FieldRedaction::Redact); - /// ``` - #[must_use] - pub fn redact_field(mut self, name: &'static str, redaction: FieldRedaction) -> Self { - self.metadata.set_redaction(name, redaction); - self.mark_dirty(); - self - } - - /// Replace metadata entirely. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind, Metadata}; - /// - /// let metadata = Metadata::new(); - /// let err = AppError::new(AppErrorKind::Internal, "test").with_metadata(metadata); - /// ``` - #[must_use] - pub fn with_metadata(mut self, metadata: Metadata) -> Self { - self.metadata = metadata; - self.mark_dirty(); - self - } - - /// Mark the message as redactable. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, AppErrorKind, MessageEditPolicy}; - /// - /// let err = AppError::new(AppErrorKind::Internal, "secret").redactable(); - /// assert_eq!(err.edit_policy, MessageEditPolicy::Redact); - /// ``` - #[must_use] - pub fn redactable(mut self) -> Self { - self.edit_policy = MessageEditPolicy::Redact; - self.mark_dirty(); - self - } - - /// Attach upstream diagnostics using [`with_source`](Self::with_source) or - /// an existing [`Arc`]. - /// - /// This is the preferred alias for capturing upstream errors. It accepts - /// either an owned error implementing [`core::error::Error`] or a - /// shared [`Arc`] produced by other APIs, reusing the allocation when - /// possible. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "std")] { - /// use masterror::AppError; - /// - /// let err = AppError::service("downstream degraded") - /// .with_context(std::io::Error::new(std::io::ErrorKind::Other, "boom")); - /// assert!(err.source_ref().is_some()); - /// # } - /// ``` - #[must_use] - pub fn with_context(self, context: impl Into) -> Self { - match context.into() { - ContextAttachment::Owned(source) => { - match source.downcast::>() { - Ok(shared) => self.with_source_arc(*shared), - Err(source) => self.with_source_arc(Arc::from(source)) - } - } - ContextAttachment::Shared(source) => self.with_source_arc(source) - } - } - - /// Attach a source error for diagnostics. - /// - /// Prefer [`with_context`](Self::with_context) when capturing upstream - /// diagnostics without additional `Arc` allocations. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "std")] { - /// use masterror::{AppError, AppErrorKind}; - /// - /// let io_err = std::io::Error::new(std::io::ErrorKind::Other, "boom"); - /// let err = AppError::internal("boom").with_source(io_err); - /// assert!(err.source_ref().is_some()); - /// # } - /// ``` - #[must_use] - pub fn with_source(mut self, source: impl CoreError + Send + Sync + 'static) -> Self { - self.source = Some(Arc::new(source)); - self.mark_dirty(); - self - } - - /// Attach a shared source error without cloning the underlying `Arc`. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "std")] { - /// use std::sync::Arc; - /// - /// use masterror::{AppError, AppErrorKind}; - /// - /// let source = Arc::new(std::io::Error::new(std::io::ErrorKind::Other, "boom")); - /// let err = AppError::internal("boom").with_source_arc(source.clone()); - /// assert!(err.source_ref().is_some()); - /// assert_eq!(Arc::strong_count(&source), 2); - /// # } - /// ``` - #[must_use] - pub fn with_source_arc(mut self, source: Arc) -> Self { - self.source = Some(source); - self.mark_dirty(); - self - } - - /// Attach a captured backtrace. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "backtrace")] - /// # { - /// use std::backtrace::Backtrace; - /// - /// use masterror::AppError; - /// - /// let bt = Backtrace::capture(); - /// let err = AppError::internal("test").with_backtrace(bt); - /// # } - /// ``` - #[must_use] - pub fn with_backtrace(mut self, backtrace: CapturedBacktrace) -> Self { - #[cfg(feature = "backtrace")] - { - self.set_backtrace_slot(Arc::new(backtrace)); - } - #[cfg(not(feature = "backtrace"))] - { - self.set_backtrace_slot(backtrace); - } - self.mark_dirty(); - self - } - - /// Attach a shared backtrace without cloning. - /// - /// Internal method for sharing backtraces between errors. - #[cfg(feature = "backtrace")] - pub(crate) fn with_shared_backtrace(mut self, backtrace: Arc) -> Self { - self.set_backtrace_slot(backtrace); - self.mark_dirty(); - self - } - - /// Attach structured JSON details for the client payload. - /// - /// The details are omitted from responses when the error has been marked as - /// [`redactable`](Self::redactable). - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "serde_json")] - /// # { - /// use masterror::{AppError, AppErrorKind}; - /// use serde_json::json; - /// - /// let err = AppError::new(AppErrorKind::Validation, "invalid input") - /// .with_details_json(json!({"field": "email"})); - /// assert!(err.details.is_some()); - /// # } - /// ``` - #[must_use] - #[cfg(feature = "serde_json")] - pub fn with_details_json(mut self, details: JsonValue) -> Self { - self.details = Some(details); - self.mark_dirty(); - self - } - - /// Serialize and attach structured details. - /// - /// Returns [`crate::AppError`] with [`crate::AppErrorKind::BadRequest`] if - /// serialization fails. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "serde_json")] - /// # { - /// use masterror::{AppError, AppErrorKind}; - /// use serde::Serialize; - /// - /// #[derive(Serialize)] - /// struct Extra { - /// reason: &'static str - /// } - /// - /// let err = AppError::new(AppErrorKind::BadRequest, "invalid") - /// .with_details(Extra { - /// reason: "missing" - /// }) - /// .expect("details should serialize"); - /// assert!(err.details.is_some()); - /// # } - /// ``` - #[cfg(feature = "serde_json")] - #[allow(clippy::result_large_err)] - pub fn with_details(self, payload: T) -> crate::AppResult - where - T: Serialize - { - let details = to_value(payload).map_err(|err| Self::bad_request(err.to_string()))?; - Ok(self.with_details_json(details)) - } - - /// Attach plain-text details for client payloads. - /// - /// The text is omitted from responses when the error is - /// [`redactable`](Self::redactable). - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(not(feature = "serde_json"))] - /// # { - /// use masterror::{AppError, AppErrorKind}; - /// - /// let err = AppError::new(AppErrorKind::Internal, "boom").with_details_text("retry later"); - /// assert!(err.details.is_some()); - /// # } - /// ``` - #[must_use] - #[cfg(not(feature = "serde_json"))] - pub fn with_details_text(mut self, details: impl Into) -> Self { - self.details = Some(details.into()); - self.mark_dirty(); - self - } - - // ───────────────────────────────────────────────────────────────────────── - // Diagnostics builder methods - // ───────────────────────────────────────────────────────────────────────── - - /// Adds a development-only hint to explain the error. - /// - /// Hints provide context about why an error occurred without necessarily - /// offering a solution. They are only shown in Local (development) mode. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::not_found("User not found") - /// .with_hint("Check if the user ID is correct") - /// .with_hint("User might have been deleted"); - /// ``` - #[must_use] - pub fn with_hint(mut self, message: impl Into>) -> Self { - use crate::app_error::diagnostics::Hint; - self.ensure_diagnostics().hints.push(Hint::new(message)); - self.mark_dirty(); - self - } - - /// Adds a hint with custom visibility. - /// - /// Use this when a hint should be visible in Staging or Production. - /// - /// # Examples - /// - /// ```rust - /// use masterror::{AppError, DiagnosticVisibility}; - /// - /// let err = AppError::unauthorized("Invalid token").with_hint_visible( - /// "Token may have expired, please login again", - /// DiagnosticVisibility::Public - /// ); - /// ``` - #[must_use] - pub fn with_hint_visible( - mut self, - message: impl Into>, - visibility: crate::app_error::diagnostics::DiagnosticVisibility - ) -> Self { - use crate::app_error::diagnostics::Hint; - self.ensure_diagnostics() - .hints - .push(Hint::with_visibility(message, visibility)); - self.mark_dirty(); - self - } - - /// Adds an actionable suggestion to fix the error. - /// - /// Suggestions provide concrete steps users can take to resolve an error. - /// They are only shown in Local (development) mode by default. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::database_with_message("Connection failed") - /// .with_suggestion("Check if the database server is running"); - /// ``` - #[must_use] - pub fn with_suggestion(mut self, message: impl Into>) -> Self { - use crate::app_error::diagnostics::Suggestion; - self.ensure_diagnostics() - .suggestions - .push(Suggestion::new(message)); - self.mark_dirty(); - self - } - - /// Adds a suggestion with an executable command or code snippet. - /// - /// The command is displayed in a distinct style to indicate it can be - /// copied and executed. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::database_with_message("PostgreSQL connection refused") - /// .with_suggestion_cmd( - /// "Check if PostgreSQL is running", - /// "systemctl status postgresql" - /// ); - /// ``` - #[must_use] - pub fn with_suggestion_cmd( - mut self, - message: impl Into>, - command: impl Into> - ) -> Self { - use crate::app_error::diagnostics::Suggestion; - self.ensure_diagnostics() - .suggestions - .push(Suggestion::with_command(message, command)); - self.mark_dirty(); - self - } - - /// Links to documentation explaining this error. - /// - /// Documentation links are publicly visible by default, helping end users - /// understand and resolve errors. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::not_found("User not found") - /// .with_docs("https://docs.example.com/errors/USER_NOT_FOUND"); - /// ``` - #[must_use] - pub fn with_docs(mut self, url: impl Into>) -> Self { - use crate::app_error::diagnostics::DocLink; - self.ensure_diagnostics().doc_link = Some(DocLink::new(url)); - self.mark_dirty(); - self - } - - /// Links to documentation with a human-readable title. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::unauthorized("Token expired").with_docs_titled( - /// "https://docs.example.com/auth/tokens", - /// "Authentication Guide" - /// ); - /// ``` - #[must_use] - pub fn with_docs_titled( - mut self, - url: impl Into>, - title: impl Into> - ) -> Self { - use crate::app_error::diagnostics::DocLink; - self.ensure_diagnostics().doc_link = Some(DocLink::with_title(url, title)); - self.mark_dirty(); - self - } - - /// Adds a related error code for cross-reference. - /// - /// Related codes help users discover errors that might provide additional - /// context or alternative explanations. - /// - /// # Examples - /// - /// ```rust - /// use masterror::AppError; - /// - /// let err = AppError::database_with_message("Connection timeout") - /// .with_related_code("DB_POOL_EXHAUSTED") - /// .with_related_code("DB_AUTH_FAILED"); - /// ``` - #[must_use] - pub fn with_related_code(mut self, code: impl Into>) -> Self { - self.ensure_diagnostics().related_codes.push(code.into()); - self.mark_dirty(); - self - } - - /// Returns a mutable reference to diagnostics, initializing if needed. - fn ensure_diagnostics(&mut self) -> &mut crate::app_error::diagnostics::Diagnostics { - use crate::app_error::diagnostics::Diagnostics; - if self.inner.diagnostics.is_none() { - self.inner.diagnostics = Some(Box::new(Diagnostics::new())); - } - self.inner - .diagnostics - .as_mut() - .expect("diagnostics initialized above") - } - - /// Returns diagnostics if present. - #[must_use] - pub fn diagnostics(&self) -> Option<&crate::app_error::diagnostics::Diagnostics> { - self.inner.diagnostics.as_deref() - } -} diff --git a/src/app_error/core/builder/constructors.rs b/src/app_error/core/builder/constructors.rs new file mode 100644 index 0000000..93328bf --- /dev/null +++ b/src/app_error/core/builder/constructors.rs @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Core constructors for creating `AppError` instances. + +use alloc::borrow::Cow; + +use crate::{AppErrorKind, app_error::core::error::Error}; + +impl Error { + /// Create a new [`Error`] with a kind and message. + /// + /// This is equivalent to [`Error::with`], provided for API symmetry and to + /// keep doctests readable. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind}; + /// let err = AppError::new(AppErrorKind::BadRequest, "invalid payload"); + /// assert!(err.message.is_some()); + /// ``` + #[must_use] + pub fn new(kind: AppErrorKind, msg: impl Into>) -> Self { + Self::with(kind, msg) + } + + /// Create an error with the given kind and message. + /// + /// Prefer named helpers (e.g. [`Error::not_found`]) where it clarifies + /// intent. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind}; + /// let err = AppError::with(AppErrorKind::Validation, "bad input"); + /// assert_eq!(err.kind, AppErrorKind::Validation); + /// ``` + #[must_use] + pub fn with(kind: AppErrorKind, msg: impl Into>) -> Self { + let err = Self::new_raw(kind, Some(msg.into())); + err.emit_telemetry(); + err + } + + /// Create a message-less error with the given kind. + /// + /// Useful when the kind alone conveys sufficient information to the client. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind}; + /// let err = AppError::bare(AppErrorKind::NotFound); + /// assert!(err.message.is_none()); + /// ``` + #[must_use] + pub fn bare(kind: AppErrorKind) -> Self { + let err = Self::new_raw(kind, None); + err.emit_telemetry(); + err + } +} diff --git a/src/app_error/core/builder/context.rs b/src/app_error/core/builder/context.rs new file mode 100644 index 0000000..654fe8d --- /dev/null +++ b/src/app_error/core/builder/context.rs @@ -0,0 +1,134 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Source and context attachment methods for `AppError`. + +use alloc::sync::Arc; +use core::error::Error as CoreError; +#[cfg(feature = "backtrace")] +use std::backtrace::Backtrace; + +use crate::app_error::core::{ + error::Error, + types::{CapturedBacktrace, ContextAttachment} +}; + +impl Error { + /// Attach upstream diagnostics using [`with_source`](Self::with_source) or + /// an existing [`Arc`]. + /// + /// This is the preferred alias for capturing upstream errors. It accepts + /// either an owned error implementing [`core::error::Error`] or a + /// shared [`Arc`] produced by other APIs, reusing the allocation when + /// possible. + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "std")] { + /// use masterror::AppError; + /// + /// let err = AppError::service("downstream degraded") + /// .with_context(std::io::Error::new(std::io::ErrorKind::Other, "boom")); + /// assert!(err.source_ref().is_some()); + /// # } + /// ``` + #[must_use] + pub fn with_context(self, context: impl Into) -> Self { + match context.into() { + ContextAttachment::Owned(source) => { + match source.downcast::>() { + Ok(shared) => self.with_source_arc(*shared), + Err(source) => self.with_source_arc(Arc::from(source)) + } + } + ContextAttachment::Shared(source) => self.with_source_arc(source) + } + } + + /// Attach a source error for diagnostics. + /// + /// Prefer [`with_context`](Self::with_context) when capturing upstream + /// diagnostics without additional `Arc` allocations. + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "std")] { + /// use masterror::{AppError, AppErrorKind}; + /// + /// let io_err = std::io::Error::new(std::io::ErrorKind::Other, "boom"); + /// let err = AppError::internal("boom").with_source(io_err); + /// assert!(err.source_ref().is_some()); + /// # } + /// ``` + #[must_use] + pub fn with_source(mut self, source: impl CoreError + Send + Sync + 'static) -> Self { + self.source = Some(Arc::new(source)); + self.mark_dirty(); + self + } + + /// Attach a shared source error without cloning the underlying `Arc`. + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "std")] { + /// use std::sync::Arc; + /// + /// use masterror::{AppError, AppErrorKind}; + /// + /// let source = Arc::new(std::io::Error::new(std::io::ErrorKind::Other, "boom")); + /// let err = AppError::internal("boom").with_source_arc(source.clone()); + /// assert!(err.source_ref().is_some()); + /// assert_eq!(Arc::strong_count(&source), 2); + /// # } + /// ``` + #[must_use] + pub fn with_source_arc(mut self, source: Arc) -> Self { + self.source = Some(source); + self.mark_dirty(); + self + } + + /// Attach a captured backtrace. + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "backtrace")] + /// # { + /// use std::backtrace::Backtrace; + /// + /// use masterror::AppError; + /// + /// let bt = Backtrace::capture(); + /// let err = AppError::internal("test").with_backtrace(bt); + /// # } + /// ``` + #[must_use] + pub fn with_backtrace(mut self, backtrace: CapturedBacktrace) -> Self { + #[cfg(feature = "backtrace")] + { + self.set_backtrace_slot(Arc::new(backtrace)); + } + #[cfg(not(feature = "backtrace"))] + { + self.set_backtrace_slot(backtrace); + } + self.mark_dirty(); + self + } + + /// Attach a shared backtrace without cloning. + /// + /// Internal method for sharing backtraces between errors. + #[cfg(feature = "backtrace")] + pub(crate) fn with_shared_backtrace(mut self, backtrace: Arc) -> Self { + self.set_backtrace_slot(backtrace); + self.mark_dirty(); + self + } +} diff --git a/src/app_error/core/builder/details.rs b/src/app_error/core/builder/details.rs new file mode 100644 index 0000000..1e63011 --- /dev/null +++ b/src/app_error/core/builder/details.rs @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Details attachment methods for `AppError`. + +#[cfg(not(feature = "serde_json"))] +use alloc::string::String; + +#[cfg(feature = "serde_json")] +use serde::Serialize; +#[cfg(feature = "serde_json")] +use serde_json::{Value as JsonValue, to_value}; + +use crate::app_error::core::error::Error; + +impl Error { + /// Attach structured JSON details for the client payload. + /// + /// The details are omitted from responses when the error has been marked as + /// [`redactable`](Self::redactable). + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "serde_json")] + /// # { + /// use masterror::{AppError, AppErrorKind}; + /// use serde_json::json; + /// + /// let err = AppError::new(AppErrorKind::Validation, "invalid input") + /// .with_details_json(json!({"field": "email"})); + /// assert!(err.details.is_some()); + /// # } + /// ``` + #[must_use] + #[cfg(feature = "serde_json")] + pub fn with_details_json(mut self, details: JsonValue) -> Self { + self.details = Some(details); + self.mark_dirty(); + self + } + + /// Serialize and attach structured details. + /// + /// Returns [`crate::AppError`] with [`crate::AppErrorKind::BadRequest`] if + /// serialization fails. + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(feature = "serde_json")] + /// # { + /// use masterror::{AppError, AppErrorKind}; + /// use serde::Serialize; + /// + /// #[derive(Serialize)] + /// struct Extra { + /// reason: &'static str + /// } + /// + /// let err = AppError::new(AppErrorKind::BadRequest, "invalid") + /// .with_details(Extra { + /// reason: "missing" + /// }) + /// .expect("details should serialize"); + /// assert!(err.details.is_some()); + /// # } + /// ``` + #[cfg(feature = "serde_json")] + #[allow(clippy::result_large_err)] + pub fn with_details(self, payload: T) -> crate::AppResult + where + T: Serialize + { + let details = to_value(payload).map_err(|err| Self::bad_request(err.to_string()))?; + Ok(self.with_details_json(details)) + } + + /// Attach plain-text details for client payloads. + /// + /// The text is omitted from responses when the error is + /// [`redactable`](Self::redactable). + /// + /// # Examples + /// + /// ```rust + /// # #[cfg(not(feature = "serde_json"))] + /// # { + /// use masterror::{AppError, AppErrorKind}; + /// + /// let err = AppError::new(AppErrorKind::Internal, "boom").with_details_text("retry later"); + /// assert!(err.details.is_some()); + /// # } + /// ``` + #[must_use] + #[cfg(not(feature = "serde_json"))] + pub fn with_details_text(mut self, details: impl Into) -> Self { + self.details = Some(details.into()); + self.mark_dirty(); + self + } +} diff --git a/src/app_error/core/builder/diagnostics.rs b/src/app_error/core/builder/diagnostics.rs new file mode 100644 index 0000000..136388a --- /dev/null +++ b/src/app_error/core/builder/diagnostics.rs @@ -0,0 +1,197 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Diagnostics builder methods for `AppError`. +//! +//! Provides methods to attach hints, suggestions, documentation links, +//! and related error codes to errors. + +use alloc::{borrow::Cow, boxed::Box}; + +use crate::app_error::{ + core::error::Error, + diagnostics::{DiagnosticVisibility, Diagnostics, DocLink, Hint, Suggestion} +}; + +impl Error { + /// Adds a development-only hint to explain the error. + /// + /// Hints provide context about why an error occurred without necessarily + /// offering a solution. They are only shown in Local (development) mode. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::not_found("User not found") + /// .with_hint("Check if the user ID is correct") + /// .with_hint("User might have been deleted"); + /// ``` + #[must_use] + pub fn with_hint(mut self, message: impl Into>) -> Self { + self.ensure_diagnostics().hints.push(Hint::new(message)); + self.mark_dirty(); + self + } + + /// Adds a hint with custom visibility. + /// + /// Use this when a hint should be visible in Staging or Production. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, DiagnosticVisibility}; + /// + /// let err = AppError::unauthorized("Invalid token").with_hint_visible( + /// "Token may have expired, please login again", + /// DiagnosticVisibility::Public + /// ); + /// ``` + #[must_use] + pub fn with_hint_visible( + mut self, + message: impl Into>, + visibility: DiagnosticVisibility + ) -> Self { + self.ensure_diagnostics() + .hints + .push(Hint::with_visibility(message, visibility)); + self.mark_dirty(); + self + } + + /// Adds an actionable suggestion to fix the error. + /// + /// Suggestions provide concrete steps users can take to resolve an error. + /// They are only shown in Local (development) mode by default. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("Connection failed") + /// .with_suggestion("Check if the database server is running"); + /// ``` + #[must_use] + pub fn with_suggestion(mut self, message: impl Into>) -> Self { + self.ensure_diagnostics() + .suggestions + .push(Suggestion::new(message)); + self.mark_dirty(); + self + } + + /// Adds a suggestion with an executable command or code snippet. + /// + /// The command is displayed in a distinct style to indicate it can be + /// copied and executed. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("PostgreSQL connection refused") + /// .with_suggestion_cmd( + /// "Check if PostgreSQL is running", + /// "systemctl status postgresql" + /// ); + /// ``` + #[must_use] + pub fn with_suggestion_cmd( + mut self, + message: impl Into>, + command: impl Into> + ) -> Self { + self.ensure_diagnostics() + .suggestions + .push(Suggestion::with_command(message, command)); + self.mark_dirty(); + self + } + + /// Links to documentation explaining this error. + /// + /// Documentation links are publicly visible by default, helping end users + /// understand and resolve errors. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::not_found("User not found") + /// .with_docs("https://docs.example.com/errors/USER_NOT_FOUND"); + /// ``` + #[must_use] + pub fn with_docs(mut self, url: impl Into>) -> Self { + self.ensure_diagnostics().doc_link = Some(DocLink::new(url)); + self.mark_dirty(); + self + } + + /// Links to documentation with a human-readable title. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::unauthorized("Token expired").with_docs_titled( + /// "https://docs.example.com/auth/tokens", + /// "Authentication Guide" + /// ); + /// ``` + #[must_use] + pub fn with_docs_titled( + mut self, + url: impl Into>, + title: impl Into> + ) -> Self { + self.ensure_diagnostics().doc_link = Some(DocLink::with_title(url, title)); + self.mark_dirty(); + self + } + + /// Adds a related error code for cross-reference. + /// + /// Related codes help users discover errors that might provide additional + /// context or alternative explanations. + /// + /// # Examples + /// + /// ```rust + /// use masterror::AppError; + /// + /// let err = AppError::database_with_message("Connection timeout") + /// .with_related_code("DB_POOL_EXHAUSTED") + /// .with_related_code("DB_AUTH_FAILED"); + /// ``` + #[must_use] + pub fn with_related_code(mut self, code: impl Into>) -> Self { + self.ensure_diagnostics().related_codes.push(code.into()); + self.mark_dirty(); + self + } + + /// Returns a mutable reference to diagnostics, initializing if needed. + fn ensure_diagnostics(&mut self) -> &mut Diagnostics { + if self.inner.diagnostics.is_none() { + self.inner.diagnostics = Some(Box::new(Diagnostics::new())); + } + self.inner + .diagnostics + .as_mut() + .expect("diagnostics initialized above") + } + + /// Returns diagnostics if present. + #[must_use] + pub fn diagnostics(&self) -> Option<&Diagnostics> { + self.inner.diagnostics.as_deref() + } +} diff --git a/src/app_error/core/builder/metadata.rs b/src/app_error/core/builder/metadata.rs new file mode 100644 index 0000000..0995500 --- /dev/null +++ b/src/app_error/core/builder/metadata.rs @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Metadata attachment methods for `AppError`. + +use crate::{ + FieldRedaction, + app_error::{ + core::error::Error, + metadata::{Field, Metadata} + } +}; + +impl Error { + /// Attach additional metadata to the error. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind, field}; + /// let err = AppError::new(AppErrorKind::Validation, "bad field") + /// .with_field(field::str("field_name", "email")); + /// assert!(err.metadata().get("field_name").is_some()); + /// ``` + #[must_use] + pub fn with_field(mut self, field: Field) -> Self { + self.metadata.insert(field); + self.mark_dirty(); + self + } + + /// Extend metadata from an iterator of fields. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind, field}; + /// let fields = vec![field::str("key1", "value1"), field::str("key2", "value2")]; + /// let err = AppError::new(AppErrorKind::BadRequest, "test").with_fields(fields); + /// assert!(err.metadata().get("key1").is_some()); + /// ``` + #[must_use] + pub fn with_fields(mut self, fields: impl IntoIterator) -> Self { + self.metadata.extend(fields); + self.mark_dirty(); + self + } + + /// Override the redaction policy for a stored metadata field. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind, FieldRedaction, field}; + /// + /// let err = AppError::new(AppErrorKind::Internal, "test") + /// .with_field(field::str("password", "secret")) + /// .redact_field("password", FieldRedaction::Redact); + /// ``` + #[must_use] + pub fn redact_field(mut self, name: &'static str, redaction: FieldRedaction) -> Self { + self.metadata.set_redaction(name, redaction); + self.mark_dirty(); + self + } + + /// Replace metadata entirely. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind, Metadata}; + /// + /// let metadata = Metadata::new(); + /// let err = AppError::new(AppErrorKind::Internal, "test").with_metadata(metadata); + /// ``` + #[must_use] + pub fn with_metadata(mut self, metadata: Metadata) -> Self { + self.metadata = metadata; + self.mark_dirty(); + self + } +} diff --git a/src/app_error/core/builder/mod.rs b/src/app_error/core/builder/mod.rs new file mode 100644 index 0000000..229ee97 --- /dev/null +++ b/src/app_error/core/builder/mod.rs @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Builder pattern implementation for `AppError`. +//! +//! This module provides fluent builder methods for constructing errors with +//! various attributes like metadata, source chains, and diagnostics. + +mod constructors; +mod context; +mod details; +mod diagnostics; +mod metadata; +mod modifiers; + +#[cfg(test)] +mod tests; diff --git a/src/app_error/core/builder/modifiers.rs b/src/app_error/core/builder/modifiers.rs new file mode 100644 index 0000000..aad1eaa --- /dev/null +++ b/src/app_error/core/builder/modifiers.rs @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Modifier methods for `AppError` that change error properties. + +use alloc::string::String; + +use crate::{ + AppCode, RetryAdvice, + app_error::core::{error::Error, types::MessageEditPolicy} +}; + +impl Error { + /// Override the machine-readable [`AppCode`]. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppCode, AppError, AppErrorKind}; + /// let err = AppError::new(AppErrorKind::BadRequest, "test").with_code(AppCode::NotFound); + /// assert_eq!(err.code, AppCode::NotFound); + /// ``` + #[must_use] + pub fn with_code(mut self, code: AppCode) -> Self { + self.code = code; + self.mark_dirty(); + self + } + + /// Attach retry advice to the error. + /// + /// When mapped to HTTP, this becomes the `Retry-After` header. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind}; + /// let err = AppError::new(AppErrorKind::RateLimited, "slow down").with_retry_after_secs(60); + /// assert_eq!(err.retry.map(|r| r.after_seconds), Some(60)); + /// ``` + #[must_use] + pub fn with_retry_after_secs(mut self, secs: u64) -> Self { + self.retry = Some(RetryAdvice { + after_seconds: secs + }); + self.mark_dirty(); + self + } + + /// Attach a `WWW-Authenticate` challenge string. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind}; + /// let err = AppError::new(AppErrorKind::Unauthorized, "auth required") + /// .with_www_authenticate("Bearer realm=\"api\""); + /// assert!(err.www_authenticate.is_some()); + /// ``` + #[must_use] + pub fn with_www_authenticate(mut self, value: impl Into) -> Self { + self.www_authenticate = Some(value.into()); + self.mark_dirty(); + self + } + + /// Mark the message as redactable. + /// + /// # Examples + /// + /// ```rust + /// use masterror::{AppError, AppErrorKind, MessageEditPolicy}; + /// + /// let err = AppError::new(AppErrorKind::Internal, "secret").redactable(); + /// assert_eq!(err.edit_policy, MessageEditPolicy::Redact); + /// ``` + #[must_use] + pub fn redactable(mut self) -> Self { + self.edit_policy = MessageEditPolicy::Redact; + self.mark_dirty(); + self + } +} diff --git a/src/app_error/core/builder/tests.rs b/src/app_error/core/builder/tests.rs new file mode 100644 index 0000000..ee976ed --- /dev/null +++ b/src/app_error/core/builder/tests.rs @@ -0,0 +1,428 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Tests for builder module. + +use crate::{AppCode, AppError, AppErrorKind, FieldRedaction, MessageEditPolicy, Metadata, field}; + +// ───────────────────────────────────────────────────────────────────────────── +// Constructors tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn new_creates_error_with_message() { + let err = AppError::new(AppErrorKind::BadRequest, "test message"); + assert_eq!(err.kind, AppErrorKind::BadRequest); + assert_eq!(err.message.as_deref(), Some("test message")); +} + +#[test] +fn new_with_owned_string() { + let msg = String::from("owned message"); + let err = AppError::new(AppErrorKind::Internal, msg); + assert_eq!(err.message.as_deref(), Some("owned message")); +} + +#[test] +fn with_creates_error_with_message() { + let err = AppError::with(AppErrorKind::Validation, "validation failed"); + assert_eq!(err.kind, AppErrorKind::Validation); + assert_eq!(err.message.as_deref(), Some("validation failed")); +} + +#[test] +fn bare_creates_error_without_message() { + let err = AppError::bare(AppErrorKind::NotFound); + assert_eq!(err.kind, AppErrorKind::NotFound); + assert!(err.message.is_none()); +} + +#[test] +fn bare_sets_correct_code() { + let err = AppError::bare(AppErrorKind::Unauthorized); + assert_eq!(err.code, AppCode::Unauthorized); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Modifiers tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn with_code_overrides_default_code() { + let err = AppError::new(AppErrorKind::BadRequest, "test").with_code(AppCode::NotFound); + assert_eq!(err.code, AppCode::NotFound); +} + +#[test] +fn with_retry_after_secs_sets_retry_advice() { + let err = AppError::new(AppErrorKind::RateLimited, "slow down").with_retry_after_secs(60); + assert!(err.retry.is_some()); + assert_eq!(err.retry.unwrap().after_seconds, 60); +} + +#[test] +fn with_retry_after_secs_zero() { + let err = AppError::new(AppErrorKind::RateLimited, "test").with_retry_after_secs(0); + assert_eq!(err.retry.unwrap().after_seconds, 0); +} + +#[test] +fn with_www_authenticate_sets_header() { + let err = AppError::new(AppErrorKind::Unauthorized, "auth required") + .with_www_authenticate("Bearer realm=\"api\""); + assert_eq!( + err.www_authenticate.as_deref(), + Some("Bearer realm=\"api\"") + ); +} + +#[test] +fn with_www_authenticate_owned_string() { + let challenge = String::from("Basic realm=\"test\""); + let err = AppError::unauthorized("test").with_www_authenticate(challenge); + assert_eq!( + err.www_authenticate.as_deref(), + Some("Basic realm=\"test\"") + ); +} + +#[test] +fn redactable_sets_edit_policy() { + let err = AppError::new(AppErrorKind::Internal, "secret").redactable(); + assert_eq!(err.edit_policy, MessageEditPolicy::Redact); +} + +#[test] +fn redactable_can_be_chained() { + let err = AppError::internal("secret") + .redactable() + .with_code(AppCode::Internal); + assert_eq!(err.edit_policy, MessageEditPolicy::Redact); + assert_eq!(err.code, AppCode::Internal); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Metadata tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn with_field_adds_metadata() { + let err = AppError::new(AppErrorKind::Validation, "bad field") + .with_field(field::str("name", "email")); + assert!(err.metadata().get("name").is_some()); +} + +#[test] +fn with_field_multiple_fields() { + let err = AppError::internal("test") + .with_field(field::str("key1", "value1")) + .with_field(field::u64("key2", 42)); + assert!(err.metadata().get("key1").is_some()); + assert!(err.metadata().get("key2").is_some()); +} + +#[test] +fn with_fields_adds_multiple() { + let fields = vec![ + field::str("a", "1"), + field::str("b", "2"), + field::str("c", "3"), + ]; + let err = AppError::new(AppErrorKind::BadRequest, "test").with_fields(fields); + assert!(err.metadata().get("a").is_some()); + assert!(err.metadata().get("b").is_some()); + assert!(err.metadata().get("c").is_some()); +} + +#[test] +fn with_fields_empty_iterator() { + let err = AppError::internal("test").with_fields(Vec::new()); + assert!(err.metadata().is_empty()); +} + +#[test] +fn redact_field_sets_redaction() { + let err = AppError::new(AppErrorKind::Internal, "test") + .with_field(field::str("password", "secret")) + .redact_field("password", FieldRedaction::Redact); + // Field exists but is marked for redaction + assert!(err.metadata().get("password").is_some()); +} + +#[test] +fn redact_field_nonexistent_field() { + let err = AppError::internal("test").redact_field("nonexistent", FieldRedaction::Redact); + // Should not panic, just no-op + assert!(err.metadata().get("nonexistent").is_none()); +} + +#[test] +fn with_metadata_replaces_all() { + let mut metadata = Metadata::new(); + metadata.insert(field::str("new_key", "new_value")); + let err = AppError::internal("test") + .with_field(field::str("old_key", "old_value")) + .with_metadata(metadata); + assert!(err.metadata().get("old_key").is_none()); + assert!(err.metadata().get("new_key").is_some()); +} + +#[test] +fn with_metadata_empty() { + let err = AppError::internal("test") + .with_field(field::str("key", "value")) + .with_metadata(Metadata::new()); + assert!(err.metadata().is_empty()); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Context tests +// ───────────────────────────────────────────────────────────────────────────── + +#[cfg(feature = "std")] +#[test] +fn with_source_attaches_error() { + use std::io::{Error as IoError, ErrorKind}; + let io_err = IoError::new(ErrorKind::NotFound, "file not found"); + let err = AppError::internal("failed").with_source(io_err); + assert!(err.source_ref().is_some()); +} + +#[cfg(feature = "std")] +#[test] +fn with_source_arc_shares_error() { + use std::{io::Error as IoError, sync::Arc}; + let source = Arc::new(IoError::other("shared error")); + let err = AppError::internal("test").with_source_arc(source.clone()); + assert!(err.source_ref().is_some()); + assert_eq!(Arc::strong_count(&source), 2); +} + +#[cfg(feature = "std")] +#[test] +fn with_context_accepts_owned_error() { + use std::io::Error as IoError; + let io_err = IoError::other("context error"); + let err = AppError::service("degraded").with_context(io_err); + assert!(err.source_ref().is_some()); +} + +#[cfg(feature = "std")] +#[test] +fn with_context_accepts_arc() { + use std::{io::Error as IoError, sync::Arc}; + let source: Arc = Arc::new(IoError::other("arc error")); + let err = AppError::internal("test").with_context(source); + assert!(err.source_ref().is_some()); +} + +#[cfg(feature = "backtrace")] +#[test] +fn with_backtrace_attaches_backtrace() { + use std::backtrace::Backtrace; + let bt = Backtrace::capture(); + let err = AppError::internal("test").with_backtrace(bt); + // Just ensure it doesn't panic + let _ = err; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Details tests +// ───────────────────────────────────────────────────────────────────────────── + +#[cfg(feature = "serde_json")] +#[test] +fn with_details_json_attaches_value() { + use serde_json::json; + let err = AppError::new(AppErrorKind::Validation, "invalid") + .with_details_json(json!({"field": "email", "reason": "invalid format"})); + assert!(err.details.is_some()); +} + +#[cfg(feature = "serde_json")] +#[test] +fn with_details_json_null() { + use serde_json::Value; + let err = AppError::internal("test").with_details_json(Value::Null); + assert!(err.details.is_some()); +} + +#[cfg(feature = "serde_json")] +#[test] +fn with_details_serializes_struct() { + use serde::Serialize; + + #[derive(Serialize)] + struct Details { + code: u32, + reason: &'static str + } + + let err = AppError::bad_request("invalid") + .with_details(Details { + code: 100, + reason: "missing field" + }) + .expect("serialization should succeed"); + assert!(err.details.is_some()); +} + +#[cfg(feature = "serde_json")] +#[test] +fn with_details_handles_serialization_error() { + use serde::Serialize; + + #[derive(Serialize)] + struct BadStruct { + #[serde(serialize_with = "fail_serialize")] + value: u32 + } + + fn fail_serialize(_: &u32, _: S) -> Result + where + S: serde::Serializer + { + Err(serde::ser::Error::custom("intentional failure")) + } + + let result = AppError::internal("test").with_details(BadStruct { + value: 0 + }); + assert!(result.is_err()); +} + +#[cfg(not(feature = "serde_json"))] +#[test] +fn with_details_text_attaches_string() { + let err = AppError::internal("test").with_details_text("additional info"); + assert!(err.details.is_some()); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Diagnostics tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn with_hint_adds_hint() { + let err = AppError::not_found("User not found").with_hint("Check user ID"); + let diag = err.diagnostics().expect("diagnostics should exist"); + assert_eq!(diag.hints.len(), 1); +} + +#[test] +fn with_hint_multiple() { + let err = AppError::not_found("test") + .with_hint("hint 1") + .with_hint("hint 2") + .with_hint("hint 3"); + let diag = err.diagnostics().unwrap(); + assert_eq!(diag.hints.len(), 3); +} + +#[test] +fn with_hint_visible_sets_visibility() { + use crate::DiagnosticVisibility; + let err = AppError::unauthorized("test") + .with_hint_visible("public hint", DiagnosticVisibility::Public); + let diag = err.diagnostics().unwrap(); + assert_eq!(diag.hints[0].visibility, DiagnosticVisibility::Public); +} + +#[test] +fn with_suggestion_adds_suggestion() { + let err = + AppError::database_with_message("Connection failed").with_suggestion("Check DB server"); + let diag = err.diagnostics().unwrap(); + assert_eq!(diag.suggestions.len(), 1); +} + +#[test] +fn with_suggestion_cmd_includes_command() { + let err = AppError::database_with_message("test") + .with_suggestion_cmd("Check status", "systemctl status postgresql"); + let diag = err.diagnostics().unwrap(); + assert!(diag.suggestions[0].command.is_some()); + assert_eq!( + diag.suggestions[0].command.as_deref(), + Some("systemctl status postgresql") + ); +} + +#[test] +fn with_docs_sets_doc_link() { + let err = AppError::not_found("test").with_docs("https://docs.example.com/errors/NOT_FOUND"); + let diag = err.diagnostics().unwrap(); + assert!(diag.doc_link.is_some()); + assert_eq!( + diag.doc_link.as_ref().unwrap().url.as_ref(), + "https://docs.example.com/errors/NOT_FOUND" + ); +} + +#[test] +fn with_docs_titled_includes_title() { + let err = AppError::unauthorized("test") + .with_docs_titled("https://docs.example.com/auth", "Authentication Guide"); + let diag = err.diagnostics().unwrap(); + let doc = diag.doc_link.as_ref().unwrap(); + assert_eq!(doc.title.as_deref(), Some("Authentication Guide")); +} + +#[test] +fn with_related_code_adds_code() { + let err = AppError::database_with_message("test") + .with_related_code("DB_POOL_EXHAUSTED") + .with_related_code("DB_AUTH_FAILED"); + let diag = err.diagnostics().unwrap(); + assert_eq!(diag.related_codes.len(), 2); +} + +#[test] +fn diagnostics_returns_none_when_empty() { + let err = AppError::internal("no diagnostics"); + assert!(err.diagnostics().is_none()); +} + +#[test] +fn diagnostics_returns_some_when_present() { + let err = AppError::internal("test").with_hint("a hint"); + assert!(err.diagnostics().is_some()); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Chaining tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn all_builders_can_be_chained() { + let err = AppError::new(AppErrorKind::Service, "service error") + .with_code(AppCode::Service) + .with_retry_after_secs(30) + .with_field(field::str("service", "payment")) + .with_hint("Check service health") + .with_suggestion("Retry in 30 seconds") + .with_docs("https://docs.example.com/errors"); + + assert_eq!(err.code, AppCode::Service); + assert!(err.retry.is_some()); + assert!(err.metadata().get("service").is_some()); + assert!(err.diagnostics().is_some()); +} + +#[cfg(feature = "std")] +#[test] +fn chaining_with_source_preserves_all() { + use std::io::Error as IoError; + + let err = AppError::internal("test") + .with_field(field::u64("request_id", 12345)) + .with_source(IoError::other("underlying error")) + .with_hint("debug hint") + .redactable(); + + assert!(err.metadata().get("request_id").is_some()); + assert!(err.source_ref().is_some()); + assert!(err.diagnostics().is_some()); + assert_eq!(err.edit_policy, MessageEditPolicy::Redact); +} From cf167e3b557f0114a3a32e47918389a4b92aa41d Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 12:19:16 +0700 Subject: [PATCH 12/16] refactor: split display module into focused submodules - mod.rs: module exports and public interface - mode.rs: DisplayMode enum and detection - helpers.rs: write_json_escaped, write_metadata_value - prod.rs: production JSON formatting - local.rs: human-readable local/dev formatting - staging.rs: staging JSON with context - tests.rs: 49 comprehensive display tests --- src/app_error/core/display.rs | 918 -------------------------- src/app_error/core/display/helpers.rs | 60 ++ src/app_error/core/display/local.rs | 282 ++++++++ src/app_error/core/display/mod.rs | 19 + src/app_error/core/display/mode.rs | 145 ++++ src/app_error/core/display/prod.rs | 73 ++ src/app_error/core/display/staging.rs | 109 +++ src/app_error/core/display/tests.rs | 383 +++++++++++ 8 files changed, 1071 insertions(+), 918 deletions(-) delete mode 100644 src/app_error/core/display.rs create mode 100644 src/app_error/core/display/helpers.rs create mode 100644 src/app_error/core/display/local.rs create mode 100644 src/app_error/core/display/mod.rs create mode 100644 src/app_error/core/display/mode.rs create mode 100644 src/app_error/core/display/prod.rs create mode 100644 src/app_error/core/display/staging.rs create mode 100644 src/app_error/core/display/tests.rs diff --git a/src/app_error/core/display.rs b/src/app_error/core/display.rs deleted file mode 100644 index 3f8ef31..0000000 --- a/src/app_error/core/display.rs +++ /dev/null @@ -1,918 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -use alloc::string::ToString; -use core::{ - error::Error as CoreError, - fmt::{Formatter, Result as FmtResult}, - sync::atomic::{AtomicU8, Ordering} -}; - -use super::error::Error; -use crate::{FieldRedaction, FieldValue, MessageEditPolicy}; - -/// Display mode for error output. -/// -/// Controls the structure and verbosity of error messages based on -/// the deployment environment. The mode is determined by the -/// `MASTERROR_ENV` environment variable or auto-detected based on -/// build configuration and runtime environment. -/// -/// # Examples -/// -/// ``` -/// use masterror::DisplayMode; -/// -/// let mode = DisplayMode::current(); -/// match mode { -/// DisplayMode::Prod => println!("Production mode: JSON output"), -/// DisplayMode::Local => println!("Local mode: Human-readable output"), -/// DisplayMode::Staging => println!("Staging mode: JSON with context") -/// } -/// ``` -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum DisplayMode { - /// Production mode: lightweight JSON, minimal fields, no sensitive data. - /// - /// Output includes only: `kind`, `code`, `message` (if not redacted). - /// Metadata is filtered to exclude sensitive fields. - /// Source chain and backtrace are excluded. - /// - /// # Example Output - /// - /// ```json - /// {"kind":"NotFound","code":"NOT_FOUND","message":"User not found"} - /// ``` - Prod = 0, - - /// Development mode: human-readable, full context. - /// - /// Output includes: error details, full source chain, complete metadata, - /// and backtrace (if enabled). Supports colored output when the `colored` - /// feature is enabled and output is a TTY. - /// - /// # Example Output - /// - /// ```text - /// Error: NotFound - /// Code: NOT_FOUND - /// Message: User not found - /// - /// Caused by: database query failed - /// Caused by: connection timeout - /// - /// Context: - /// user_id: 12345 - /// ``` - Local = 1, - - /// Staging mode: JSON with additional context. - /// - /// Output includes: `kind`, `code`, `message`, limited `source_chain`, - /// and filtered metadata. No backtrace. - /// - /// # Example Output - /// - /// ```json - /// {"kind":"NotFound","code":"NOT_FOUND","message":"User not found","source_chain":["database error"],"metadata":{"user_id":12345}} - /// ``` - Staging = 2 -} - -impl DisplayMode { - /// Returns the current display mode based on environment configuration. - /// - /// The mode is determined by checking (in order): - /// 1. `MASTERROR_ENV` environment variable (`prod`, `local`, or `staging`) - /// 2. Kubernetes environment detection (`KUBERNETES_SERVICE_HOST`) - /// 3. Build configuration (`cfg!(debug_assertions)`) - /// - /// The result is cached for performance. - /// - /// # Examples - /// - /// ``` - /// use masterror::DisplayMode; - /// - /// let mode = DisplayMode::current(); - /// assert!(matches!( - /// mode, - /// DisplayMode::Prod | DisplayMode::Local | DisplayMode::Staging - /// )); - /// ``` - #[must_use] - pub fn current() -> Self { - static CACHED_MODE: AtomicU8 = AtomicU8::new(255); - let cached = CACHED_MODE.load(Ordering::Relaxed); - if cached != 255 { - return match cached { - 0 => Self::Prod, - 1 => Self::Local, - 2 => Self::Staging, - _ => unreachable!() - }; - } - let mode = Self::detect(); - CACHED_MODE.store(mode as u8, Ordering::Relaxed); - mode - } - - /// Detects the appropriate display mode from environment. - /// - /// This is an internal helper called by [`current()`](Self::current). - fn detect() -> Self { - #[cfg(feature = "std")] - { - use std::env::var; - if let Ok(env) = var("MASTERROR_ENV") { - return match env.as_str() { - "prod" | "production" => Self::Prod, - "local" | "dev" | "development" => Self::Local, - "staging" | "stage" => Self::Staging, - _ => Self::detect_auto() - }; - } - if var("KUBERNETES_SERVICE_HOST").is_ok() { - return Self::Prod; - } - } - Self::detect_auto() - } - - /// Auto-detects mode based on build configuration. - fn detect_auto() -> Self { - if cfg!(debug_assertions) { - Self::Local - } else { - Self::Prod - } - } -} - -#[allow(dead_code)] -impl Error { - /// Formats error in production mode (compact JSON). - /// - /// # Arguments - /// - /// * `f` - Formatter to write output to - /// - /// # Examples - /// - /// ``` - /// use masterror::AppError; - /// - /// let error = AppError::not_found("User not found"); - /// let output = format!("{}", error); - /// // In prod mode: {"kind":"NotFound","code":"NOT_FOUND","message":"User not found"} - /// ``` - #[cfg(not(test))] - pub(crate) fn fmt_prod(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_prod_impl(f) - } - - #[cfg(test)] - #[allow(missing_docs)] - pub fn fmt_prod(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_prod_impl(f) - } - - fn fmt_prod_impl(&self, f: &mut Formatter<'_>) -> FmtResult { - write!(f, r#"{{"kind":"{:?}","code":"{}""#, self.kind, self.code)?; - if !matches!(self.edit_policy, MessageEditPolicy::Redact) - && let Some(msg) = &self.message - { - write!(f, ",\"message\":\"")?; - write_json_escaped(f, msg.as_ref())?; - write!(f, "\"")?; - } - if !self.metadata.is_empty() { - let has_public_fields = self - .metadata - .iter_with_redaction() - .any(|(_, _, redaction)| !matches!(redaction, FieldRedaction::Redact)); - if has_public_fields { - write!(f, r#","metadata":{{"#)?; - let mut first = true; - for (name, value, redaction) in self.metadata.iter_with_redaction() { - if matches!(redaction, FieldRedaction::Redact) { - continue; - } - if !first { - write!(f, ",")?; - } - first = false; - write!(f, r#""{}":"#, name)?; - write_metadata_value(f, value)?; - } - write!(f, "}}")?; - } - } - write!(f, "}}") - } - - /// Formats error in local/development mode (human-readable). - /// - /// # Arguments - /// - /// * `f` - Formatter to write output to - /// - /// # Examples - /// - /// ``` - /// use masterror::AppError; - /// - /// let error = AppError::internal("Database error"); - /// let output = format!("{}", error); - /// // In local mode: multi-line human-readable format with full context - /// ``` - #[cfg(not(test))] - pub(crate) fn fmt_local(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_local_impl(f) - } - - #[cfg(test)] - #[allow(missing_docs)] - pub fn fmt_local(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_local_impl(f) - } - - fn fmt_local_impl(&self, f: &mut Formatter<'_>) -> FmtResult { - #[cfg(feature = "colored")] - { - use crate::colored::style; - writeln!(f, "Error: {}", self.kind)?; - writeln!(f, "Code: {}", style::error_code(self.code.to_string()))?; - if let Some(msg) = &self.message { - writeln!(f, "Message: {}", style::error_message(msg))?; - } - if let Some(source) = &self.source { - writeln!(f)?; - let mut current: &dyn CoreError = source.as_ref(); - let mut depth = 0; - while depth < 10 { - writeln!( - f, - " {}: {}", - style::source_context("Caused by"), - style::source_context(current.to_string()) - )?; - if let Some(next) = current.source() { - current = next; - depth += 1; - } else { - break; - } - } - } - if !self.metadata.is_empty() { - writeln!(f)?; - writeln!(f, "Context:")?; - for (key, value) in self.metadata.iter() { - writeln!(f, " {}: {}", style::metadata_key(key), value)?; - } - } - // Diagnostics (hints, suggestions, docs) - if let Some(diag) = &self.diagnostics { - use crate::app_error::diagnostics::DiagnosticVisibility; - let min_visibility = DiagnosticVisibility::DevOnly; - - // Hints - let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); - if !hints.is_empty() { - writeln!(f)?; - for hint in hints { - writeln!( - f, - " {}: {}", - style::hint_label("hint"), - style::hint_text(&hint.message) - )?; - } - } - - // Suggestions - for suggestion in diag.visible_suggestions(min_visibility) { - writeln!(f)?; - write!( - f, - " {}: {}", - style::suggestion_label("suggestion"), - style::suggestion_text(&suggestion.message) - )?; - if let Some(cmd) = &suggestion.command { - writeln!(f)?; - writeln!(f, " {}", style::command(cmd))?; - } else { - writeln!(f)?; - } - } - - // Documentation link - if let Some(doc) = diag.visible_doc_link(min_visibility) { - writeln!(f)?; - if let Some(title) = &doc.title { - writeln!( - f, - " {}: {} ({})", - style::docs_label("docs"), - title, - style::url(&doc.url) - )?; - } else { - writeln!( - f, - " {}: {}", - style::docs_label("docs"), - style::url(&doc.url) - )?; - } - } - - // Related codes - if !diag.related_codes.is_empty() { - writeln!(f)?; - write!(f, " {}: ", style::related_label("see also"))?; - for (i, code) in diag.related_codes.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{}", style::error_code(code))?; - } - writeln!(f)?; - } - } - Ok(()) - } - #[cfg(not(feature = "colored"))] - { - writeln!(f, "Error: {}", self.kind)?; - writeln!(f, "Code: {}", self.code)?; - if let Some(msg) = &self.message { - writeln!(f, "Message: {}", msg)?; - } - if let Some(source) = &self.source { - writeln!(f)?; - let mut current: &dyn CoreError = source.as_ref(); - let mut depth = 0; - while depth < 10 { - writeln!(f, " Caused by: {}", current)?; - if let Some(next) = current.source() { - current = next; - depth += 1; - } else { - break; - } - } - } - if !self.metadata.is_empty() { - writeln!(f)?; - writeln!(f, "Context:")?; - for (key, value) in self.metadata.iter() { - writeln!(f, " {}: {}", key, value)?; - } - } - // Diagnostics (hints, suggestions, docs) - if let Some(diag) = &self.diagnostics { - use crate::app_error::diagnostics::DiagnosticVisibility; - let min_visibility = DiagnosticVisibility::DevOnly; - - // Hints - let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); - if !hints.is_empty() { - writeln!(f)?; - for hint in hints { - writeln!(f, " hint: {}", hint.message)?; - } - } - - // Suggestions - for suggestion in diag.visible_suggestions(min_visibility) { - writeln!(f)?; - write!(f, " suggestion: {}", suggestion.message)?; - if let Some(cmd) = &suggestion.command { - writeln!(f)?; - writeln!(f, " {}", cmd)?; - } else { - writeln!(f)?; - } - } - - // Documentation link - if let Some(doc) = diag.visible_doc_link(min_visibility) { - writeln!(f)?; - if let Some(title) = &doc.title { - writeln!(f, " docs: {} ({})", title, doc.url)?; - } else { - writeln!(f, " docs: {}", doc.url)?; - } - } - - // Related codes - if !diag.related_codes.is_empty() { - writeln!(f)?; - write!(f, " see also: ")?; - for (i, code) in diag.related_codes.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{}", code)?; - } - writeln!(f)?; - } - } - Ok(()) - } - } - - /// Formats error in staging mode (JSON with context). - /// - /// # Arguments - /// - /// * `f` - Formatter to write output to - /// - /// # Examples - /// - /// ``` - /// use masterror::AppError; - /// - /// let error = AppError::service("Service unavailable"); - /// let output = format!("{}", error); - /// // In staging mode: JSON with source_chain and metadata - /// ``` - #[cfg(not(test))] - pub(crate) fn fmt_staging(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_staging_impl(f) - } - - #[cfg(test)] - #[allow(missing_docs)] - pub fn fmt_staging(&self, f: &mut Formatter<'_>) -> FmtResult { - self.fmt_staging_impl(f) - } - - fn fmt_staging_impl(&self, f: &mut Formatter<'_>) -> FmtResult { - write!(f, r#"{{"kind":"{:?}","code":"{}""#, self.kind, self.code)?; - if !matches!(self.edit_policy, MessageEditPolicy::Redact) - && let Some(msg) = &self.message - { - write!(f, ",\"message\":\"")?; - write_json_escaped(f, msg.as_ref())?; - write!(f, "\"")?; - } - if let Some(source) = &self.source { - write!(f, r#","source_chain":["#)?; - let mut current: &dyn CoreError = source.as_ref(); - let mut depth = 0; - let mut first = true; - while depth < 5 { - if !first { - write!(f, ",")?; - } - first = false; - write!(f, "\"")?; - write_json_escaped(f, ¤t.to_string())?; - write!(f, "\"")?; - if let Some(next) = current.source() { - current = next; - depth += 1; - } else { - break; - } - } - write!(f, "]")?; - } - if !self.metadata.is_empty() { - let has_public_fields = self - .metadata - .iter_with_redaction() - .any(|(_, _, redaction)| !matches!(redaction, FieldRedaction::Redact)); - if has_public_fields { - write!(f, r#","metadata":{{"#)?; - let mut first = true; - for (name, value, redaction) in self.metadata.iter_with_redaction() { - if matches!(redaction, FieldRedaction::Redact) { - continue; - } - if !first { - write!(f, ",")?; - } - first = false; - write!(f, r#""{}":"#, name)?; - write_metadata_value(f, value)?; - } - write!(f, "}}")?; - } - } - write!(f, "}}") - } -} - -/// Writes a string with JSON escaping. -#[allow(dead_code)] -fn write_json_escaped(f: &mut Formatter<'_>, s: &str) -> FmtResult { - for ch in s.chars() { - match ch { - '"' => write!(f, "\\\"")?, - '\\' => write!(f, "\\\\")?, - '\n' => write!(f, "\\n")?, - '\r' => write!(f, "\\r")?, - '\t' => write!(f, "\\t")?, - ch if ch.is_control() => write!(f, "\\u{:04x}", ch as u32)?, - ch => write!(f, "{}", ch)? - } - } - Ok(()) -} - -/// Writes a metadata field value in JSON format. -#[allow(dead_code)] -fn write_metadata_value(f: &mut Formatter<'_>, value: &FieldValue) -> FmtResult { - use crate::app_error::metadata::FieldValue; - match value { - FieldValue::Str(s) => { - write!(f, "\"")?; - write_json_escaped(f, s.as_ref())?; - write!(f, "\"") - } - FieldValue::I64(v) => write!(f, "{}", v), - FieldValue::U64(v) => write!(f, "{}", v), - FieldValue::F64(v) => { - if v.is_finite() { - write!(f, "{}", v) - } else { - write!(f, "null") - } - } - FieldValue::Bool(v) => write!(f, "{}", v), - FieldValue::Uuid(v) => write!(f, "\"{}\"", v), - FieldValue::Duration(v) => { - write!( - f, - r#"{{"secs":{},"nanos":{}}}"#, - v.as_secs(), - v.subsec_nanos() - ) - } - FieldValue::Ip(v) => write!(f, "\"{}\"", v), - #[cfg(feature = "serde_json")] - FieldValue::Json(v) => write!(f, "{}", v) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{AppError, field}; - - #[test] - fn display_mode_current_returns_valid_mode() { - let mode = DisplayMode::current(); - assert!(matches!( - mode, - DisplayMode::Prod | DisplayMode::Local | DisplayMode::Staging - )); - } - - #[test] - fn display_mode_detect_auto_returns_local_in_debug() { - if cfg!(debug_assertions) { - assert_eq!(DisplayMode::detect_auto(), DisplayMode::Local); - } else { - assert_eq!(DisplayMode::detect_auto(), DisplayMode::Prod); - } - } - - #[test] - fn fmt_prod_outputs_json() { - let error = AppError::not_found("User not found"); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""kind":"NotFound""#)); - assert!(output.contains(r#""code":"NOT_FOUND""#)); - assert!(output.contains(r#""message":"User not found""#)); - } - - #[test] - fn fmt_prod_excludes_redacted_message() { - let error = AppError::internal("secret").redactable(); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(!output.contains("secret")); - } - - #[test] - fn fmt_prod_includes_metadata() { - let error = AppError::not_found("User not found").with_field(field::u64("user_id", 12345)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""metadata""#)); - assert!(output.contains(r#""user_id":12345"#)); - } - - #[test] - fn fmt_prod_excludes_sensitive_metadata() { - let error = AppError::internal("Error").with_field(field::str("password", "secret")); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(!output.contains("secret")); - } - - #[test] - fn fmt_local_outputs_human_readable() { - let error = AppError::not_found("User not found"); - let output = format!("{}", error.fmt_local_wrapper()); - assert!(output.contains("Error:")); - assert!(output.contains("Code: NOT_FOUND")); - assert!(output.contains("Message: User not found")); - } - - #[cfg(feature = "std")] - #[test] - fn fmt_local_includes_source_chain() { - use std::io::Error as IoError; - let io_err = IoError::other("connection failed"); - let error = AppError::internal("Database error").with_source(io_err); - let output = format!("{}", error.fmt_local_wrapper()); - assert!(output.contains("Caused by")); - assert!(output.contains("connection failed")); - } - - #[test] - fn fmt_staging_outputs_json_with_context() { - let error = AppError::service("Service unavailable"); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""kind":"Service""#)); - assert!(output.contains(r#""code":"SERVICE""#)); - } - - #[cfg(feature = "std")] - #[test] - fn fmt_staging_includes_source_chain() { - use std::io::Error as IoError; - let io_err = IoError::other("timeout"); - let error = AppError::network("Network error").with_source(io_err); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""source_chain""#)); - assert!(output.contains("timeout")); - } - - #[test] - fn fmt_prod_escapes_special_chars() { - let error = AppError::internal("Line\nwith\"quotes\""); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#"\n"#)); - assert!(output.contains(r#"\""#)); - } - - #[test] - fn fmt_prod_handles_infinity_in_metadata() { - let error = AppError::internal("Error").with_field(field::f64("ratio", f64::INFINITY)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains("null")); - } - - #[test] - fn fmt_prod_formats_duration_metadata() { - use core::time::Duration; - let error = AppError::internal("Error") - .with_field(field::duration("elapsed", Duration::from_millis(1500))); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""secs":1"#)); - assert!(output.contains(r#""nanos":500000000"#)); - } - - #[test] - fn fmt_prod_formats_bool_metadata() { - let error = AppError::internal("Error").with_field(field::bool("active", true)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""active":true"#)); - } - - #[cfg(feature = "std")] - #[test] - fn fmt_prod_formats_ip_metadata() { - use std::net::IpAddr; - let ip: IpAddr = "192.168.1.1".parse().unwrap(); - let error = AppError::internal("Error").with_field(field::ip("client_ip", ip)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""client_ip":"192.168.1.1""#)); - } - - #[test] - fn fmt_prod_formats_uuid_metadata() { - use uuid::Uuid; - let uuid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap(); - let error = AppError::internal("Error").with_field(field::uuid("request_id", uuid)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""request_id":"550e8400-e29b-41d4-a716-446655440000""#)); - } - - #[cfg(feature = "serde_json")] - #[test] - fn fmt_prod_formats_json_metadata() { - let json = serde_json::json!({"nested": "value"}); - let error = AppError::internal("Error").with_field(field::json("data", json)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""data":"#)); - } - - #[test] - fn fmt_prod_without_message() { - let error = AppError::bare(crate::AppErrorKind::Internal); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""kind":"Internal""#)); - assert!(!output.contains(r#""message""#)); - } - - #[test] - fn fmt_local_without_message() { - let error = AppError::bare(crate::AppErrorKind::BadRequest); - let output = format!("{}", error.fmt_local_wrapper()); - assert!(output.contains("Error:")); - assert!(!output.contains("Message:")); - } - - #[test] - fn fmt_local_with_metadata() { - let error = AppError::internal("Error") - .with_field(field::str("key", "value")) - .with_field(field::i64("count", -42)); - let output = format!("{}", error.fmt_local_wrapper()); - assert!(output.contains("Context:")); - assert!(output.contains("key: value")); - assert!(output.contains("count: -42")); - } - - #[test] - fn fmt_staging_without_message() { - let error = AppError::bare(crate::AppErrorKind::Timeout); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""kind":"Timeout""#)); - assert!(!output.contains(r#""message""#)); - } - - #[test] - fn fmt_staging_with_metadata() { - let error = AppError::service("Service error").with_field(field::u64("retry_count", 3)); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""metadata""#)); - assert!(output.contains(r#""retry_count":3"#)); - } - - #[test] - fn fmt_staging_with_redacted_message() { - let error = AppError::internal("sensitive data").redactable(); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(!output.contains("sensitive data")); - } - - #[test] - fn fmt_prod_escapes_control_chars() { - let error = AppError::internal("test\x00\x1F"); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#"\u0000"#)); - assert!(output.contains(r#"\u001f"#)); - } - - #[test] - fn fmt_prod_escapes_tab_and_carriage_return() { - let error = AppError::internal("line\ttab\rreturn"); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#"\t"#)); - assert!(output.contains(r#"\r"#)); - } - - #[test] - fn display_mode_current_caches_result() { - let first = DisplayMode::current(); - let second = DisplayMode::current(); - assert_eq!(first, second); - } - - #[test] - fn display_mode_detect_auto_returns_prod_in_release() { - if !cfg!(debug_assertions) { - assert_eq!(DisplayMode::detect_auto(), DisplayMode::Prod); - } - } - - #[test] - fn fmt_prod_with_multiple_metadata_fields() { - let error = AppError::not_found("test") - .with_field(field::str("first", "value1")) - .with_field(field::u64("second", 42)) - .with_field(field::bool("third", true)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""first":"value1""#)); - assert!(output.contains(r#""second":42"#)); - assert!(output.contains(r#""third":true"#)); - } - - #[test] - fn fmt_prod_escapes_backslash() { - let error = AppError::internal("path\\to\\file"); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#"path\\to\\file"#)); - } - - #[test] - fn fmt_prod_with_i64_metadata() { - let error = AppError::internal("test").with_field(field::i64("count", -100)); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""count":-100"#)); - } - - #[test] - fn fmt_prod_with_string_metadata() { - let error = AppError::internal("test").with_field(field::str("name", "value")); - let output = format!("{}", error.fmt_prod_wrapper()); - assert!(output.contains(r#""name":"value""#)); - } - - #[cfg(feature = "colored")] - #[test] - fn fmt_local_with_deep_source_chain() { - use std::io::{Error as IoError, ErrorKind}; - let io1 = IoError::new(ErrorKind::NotFound, "level 1"); - let io2 = IoError::other(io1); - let error = AppError::internal("top").with_source(io2); - let output = format!("{}", error.fmt_local_wrapper()); - assert!(output.contains("Caused by")); - assert!(output.contains("level 1")); - } - - #[test] - fn fmt_staging_with_multiple_metadata_fields() { - let error = AppError::service("error") - .with_field(field::str("key1", "value1")) - .with_field(field::u64("key2", 123)) - .with_field(field::bool("key3", false)); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""key1":"value1""#)); - assert!(output.contains(r#""key2":123"#)); - assert!(output.contains(r#""key3":false"#)); - } - - #[test] - fn fmt_staging_with_deep_source_chain() { - use std::io::{Error as IoError, ErrorKind}; - let io1 = IoError::new(ErrorKind::NotFound, "inner error"); - let io2 = IoError::other(io1); - let error = AppError::service("outer").with_source(io2); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""source_chain""#)); - assert!(output.contains("inner error")); - } - - #[test] - fn fmt_staging_with_redacted_and_public_metadata() { - let error = AppError::internal("test") - .with_field(field::str("public", "visible")) - .with_field(field::str("password", "secret")); - let output = format!("{}", error.fmt_staging_wrapper()); - assert!(output.contains(r#""public":"visible""#)); - assert!(!output.contains("secret")); - } - - impl Error { - fn fmt_prod_wrapper(&self) -> FormatterWrapper<'_> { - FormatterWrapper { - error: self, - mode: FormatterMode::Prod - } - } - - fn fmt_local_wrapper(&self) -> FormatterWrapper<'_> { - FormatterWrapper { - error: self, - mode: FormatterMode::Local - } - } - - fn fmt_staging_wrapper(&self) -> FormatterWrapper<'_> { - FormatterWrapper { - error: self, - mode: FormatterMode::Staging - } - } - } - - enum FormatterMode { - Prod, - Local, - Staging - } - - struct FormatterWrapper<'a> { - error: &'a Error, - mode: FormatterMode - } - - impl core::fmt::Display for FormatterWrapper<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { - match self.mode { - FormatterMode::Prod => self.error.fmt_prod(f), - FormatterMode::Local => self.error.fmt_local(f), - FormatterMode::Staging => self.error.fmt_staging(f) - } - } - } -} diff --git a/src/app_error/core/display/helpers.rs b/src/app_error/core/display/helpers.rs new file mode 100644 index 0000000..e1d8827 --- /dev/null +++ b/src/app_error/core/display/helpers.rs @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Helper functions for display formatting. + +use core::fmt::{Formatter, Result as FmtResult}; + +use crate::FieldValue; + +#[allow(dead_code)] +/// Writes a string with JSON escaping. +pub(super) fn write_json_escaped(f: &mut Formatter<'_>, s: &str) -> FmtResult { + for ch in s.chars() { + match ch { + '"' => write!(f, "\\\"")?, + '\\' => write!(f, "\\\\")?, + '\n' => write!(f, "\\n")?, + '\r' => write!(f, "\\r")?, + '\t' => write!(f, "\\t")?, + ch if ch.is_control() => write!(f, "\\u{:04x}", ch as u32)?, + ch => write!(f, "{}", ch)? + } + } + Ok(()) +} + +#[allow(dead_code)] +/// Writes a metadata field value in JSON format. +pub(super) fn write_metadata_value(f: &mut Formatter<'_>, value: &FieldValue) -> FmtResult { + match value { + FieldValue::Str(s) => { + write!(f, "\"")?; + write_json_escaped(f, s.as_ref())?; + write!(f, "\"") + } + FieldValue::I64(v) => write!(f, "{}", v), + FieldValue::U64(v) => write!(f, "{}", v), + FieldValue::F64(v) => { + if v.is_finite() { + write!(f, "{}", v) + } else { + write!(f, "null") + } + } + FieldValue::Bool(v) => write!(f, "{}", v), + FieldValue::Uuid(v) => write!(f, "\"{}\"", v), + FieldValue::Duration(v) => { + write!( + f, + r#"{{"secs":{},"nanos":{}}}"#, + v.as_secs(), + v.subsec_nanos() + ) + } + FieldValue::Ip(v) => write!(f, "\"{}\"", v), + #[cfg(feature = "serde_json")] + FieldValue::Json(v) => write!(f, "{}", v) + } +} diff --git a/src/app_error/core/display/local.rs b/src/app_error/core/display/local.rs new file mode 100644 index 0000000..bdc03e6 --- /dev/null +++ b/src/app_error/core/display/local.rs @@ -0,0 +1,282 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Local/development mode formatting (human-readable). + +#[cfg(feature = "colored")] +use alloc::string::ToString; +use core::{ + error::Error as CoreError, + fmt::{Formatter, Result as FmtResult} +}; + +use crate::app_error::core::error::Error; + +#[allow(dead_code)] +impl Error { + /// Formats error in local/development mode (human-readable). + /// + /// # Arguments + /// + /// * `f` - Formatter to write output to + /// + /// # Examples + /// + /// ``` + /// use masterror::AppError; + /// + /// let error = AppError::internal("Database error"); + /// let output = format!("{}", error); + /// // In local mode: multi-line human-readable format with full context + /// ``` + #[cfg(not(test))] + pub(crate) fn fmt_local(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_local_impl(f) + } + + #[cfg(test)] + #[allow(missing_docs)] + pub fn fmt_local(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_local_impl(f) + } + + pub(super) fn fmt_local_impl(&self, f: &mut Formatter<'_>) -> FmtResult { + #[cfg(feature = "colored")] + { + self.fmt_local_colored(f) + } + #[cfg(not(feature = "colored"))] + { + self.fmt_local_plain(f) + } + } + + #[cfg(feature = "colored")] + fn fmt_local_colored(&self, f: &mut Formatter<'_>) -> FmtResult { + use crate::colored::style; + + writeln!(f, "Error: {}", self.kind)?; + writeln!(f, "Code: {}", style::error_code(self.code.to_string()))?; + if let Some(msg) = &self.message { + writeln!(f, "Message: {}", style::error_message(msg))?; + } + self.fmt_source_chain_colored(f)?; + self.fmt_metadata_colored(f)?; + self.fmt_diagnostics_colored(f)?; + Ok(()) + } + + #[cfg(feature = "colored")] + fn fmt_source_chain_colored(&self, f: &mut Formatter<'_>) -> FmtResult { + use crate::colored::style; + + if let Some(source) = &self.source { + writeln!(f)?; + let mut current: &dyn CoreError = source.as_ref(); + let mut depth = 0; + while depth < 10 { + writeln!( + f, + " {}: {}", + style::source_context("Caused by"), + style::source_context(current.to_string()) + )?; + if let Some(next) = current.source() { + current = next; + depth += 1; + } else { + break; + } + } + } + Ok(()) + } + + #[cfg(feature = "colored")] + fn fmt_metadata_colored(&self, f: &mut Formatter<'_>) -> FmtResult { + use crate::colored::style; + + if !self.metadata.is_empty() { + writeln!(f)?; + writeln!(f, "Context:")?; + for (key, value) in self.metadata.iter() { + writeln!(f, " {}: {}", style::metadata_key(key), value)?; + } + } + Ok(()) + } + + #[cfg(feature = "colored")] + fn fmt_diagnostics_colored(&self, f: &mut Formatter<'_>) -> FmtResult { + use crate::{app_error::diagnostics::DiagnosticVisibility, colored::style}; + + if let Some(diag) = &self.diagnostics { + let min_visibility = DiagnosticVisibility::DevOnly; + + // Hints + let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); + if !hints.is_empty() { + writeln!(f)?; + for hint in hints { + writeln!( + f, + " {}: {}", + style::hint_label("hint"), + style::hint_text(&hint.message) + )?; + } + } + + // Suggestions + for suggestion in diag.visible_suggestions(min_visibility) { + writeln!(f)?; + write!( + f, + " {}: {}", + style::suggestion_label("suggestion"), + style::suggestion_text(&suggestion.message) + )?; + if let Some(cmd) = &suggestion.command { + writeln!(f)?; + writeln!(f, " {}", style::command(cmd))?; + } else { + writeln!(f)?; + } + } + + // Documentation link + if let Some(doc) = diag.visible_doc_link(min_visibility) { + writeln!(f)?; + if let Some(title) = &doc.title { + writeln!( + f, + " {}: {} ({})", + style::docs_label("docs"), + title, + style::url(&doc.url) + )?; + } else { + writeln!( + f, + " {}: {}", + style::docs_label("docs"), + style::url(&doc.url) + )?; + } + } + + // Related codes + if !diag.related_codes.is_empty() { + writeln!(f)?; + write!(f, " {}: ", style::related_label("see also"))?; + for (i, code) in diag.related_codes.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", style::error_code(code))?; + } + writeln!(f)?; + } + } + Ok(()) + } + + #[cfg(not(feature = "colored"))] + fn fmt_local_plain(&self, f: &mut Formatter<'_>) -> FmtResult { + writeln!(f, "Error: {}", self.kind)?; + writeln!(f, "Code: {}", self.code)?; + if let Some(msg) = &self.message { + writeln!(f, "Message: {}", msg)?; + } + self.fmt_source_chain_plain(f)?; + self.fmt_metadata_plain(f)?; + self.fmt_diagnostics_plain(f)?; + Ok(()) + } + + #[cfg(not(feature = "colored"))] + fn fmt_source_chain_plain(&self, f: &mut Formatter<'_>) -> FmtResult { + if let Some(source) = &self.source { + writeln!(f)?; + let mut current: &dyn CoreError = source.as_ref(); + let mut depth = 0; + while depth < 10 { + writeln!(f, " Caused by: {}", current)?; + if let Some(next) = current.source() { + current = next; + depth += 1; + } else { + break; + } + } + } + Ok(()) + } + + #[cfg(not(feature = "colored"))] + fn fmt_metadata_plain(&self, f: &mut Formatter<'_>) -> FmtResult { + if !self.metadata.is_empty() { + writeln!(f)?; + writeln!(f, "Context:")?; + for (key, value) in self.metadata.iter() { + writeln!(f, " {}: {}", key, value)?; + } + } + Ok(()) + } + + #[cfg(not(feature = "colored"))] + fn fmt_diagnostics_plain(&self, f: &mut Formatter<'_>) -> FmtResult { + use crate::app_error::diagnostics::DiagnosticVisibility; + + if let Some(diag) = &self.diagnostics { + let min_visibility = DiagnosticVisibility::DevOnly; + + // Hints + let hints: alloc::vec::Vec<_> = diag.visible_hints(min_visibility).collect(); + if !hints.is_empty() { + writeln!(f)?; + for hint in hints { + writeln!(f, " hint: {}", hint.message)?; + } + } + + // Suggestions + for suggestion in diag.visible_suggestions(min_visibility) { + writeln!(f)?; + write!(f, " suggestion: {}", suggestion.message)?; + if let Some(cmd) = &suggestion.command { + writeln!(f)?; + writeln!(f, " {}", cmd)?; + } else { + writeln!(f)?; + } + } + + // Documentation link + if let Some(doc) = diag.visible_doc_link(min_visibility) { + writeln!(f)?; + if let Some(title) = &doc.title { + writeln!(f, " docs: {} ({})", title, doc.url)?; + } else { + writeln!(f, " docs: {}", doc.url)?; + } + } + + // Related codes + if !diag.related_codes.is_empty() { + writeln!(f)?; + write!(f, " see also: ")?; + for (i, code) in diag.related_codes.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}", code)?; + } + writeln!(f)?; + } + } + Ok(()) + } +} diff --git a/src/app_error/core/display/mod.rs b/src/app_error/core/display/mod.rs new file mode 100644 index 0000000..77c2dc1 --- /dev/null +++ b/src/app_error/core/display/mod.rs @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Display formatting for `AppError`. +//! +//! Provides environment-aware display modes: production (compact JSON), +//! local (human-readable), and staging (JSON with context). + +mod helpers; +mod local; +mod mode; +mod prod; +mod staging; + +#[cfg(test)] +mod tests; + +pub use mode::DisplayMode; diff --git a/src/app_error/core/display/mode.rs b/src/app_error/core/display/mode.rs new file mode 100644 index 0000000..dd88b49 --- /dev/null +++ b/src/app_error/core/display/mode.rs @@ -0,0 +1,145 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Display mode detection and configuration. + +use core::sync::atomic::{AtomicU8, Ordering}; + +/// Display mode for error output. +/// +/// Controls the structure and verbosity of error messages based on +/// the deployment environment. The mode is determined by the +/// `MASTERROR_ENV` environment variable or auto-detected based on +/// build configuration and runtime environment. +/// +/// # Examples +/// +/// ``` +/// use masterror::DisplayMode; +/// +/// let mode = DisplayMode::current(); +/// match mode { +/// DisplayMode::Prod => println!("Production mode: JSON output"), +/// DisplayMode::Local => println!("Local mode: Human-readable output"), +/// DisplayMode::Staging => println!("Staging mode: JSON with context") +/// } +/// ``` +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DisplayMode { + /// Production mode: lightweight JSON, minimal fields, no sensitive data. + /// + /// Output includes only: `kind`, `code`, `message` (if not redacted). + /// Metadata is filtered to exclude sensitive fields. + /// Source chain and backtrace are excluded. + /// + /// # Example Output + /// + /// ```json + /// {"kind":"NotFound","code":"NOT_FOUND","message":"User not found"} + /// ``` + Prod = 0, + + /// Development mode: human-readable, full context. + /// + /// Output includes: error details, full source chain, complete metadata, + /// and backtrace (if enabled). Supports colored output when the `colored` + /// feature is enabled and output is a TTY. + /// + /// # Example Output + /// + /// ```text + /// Error: NotFound + /// Code: NOT_FOUND + /// Message: User not found + /// + /// Caused by: database query failed + /// Caused by: connection timeout + /// + /// Context: + /// user_id: 12345 + /// ``` + Local = 1, + + /// Staging mode: JSON with additional context. + /// + /// Output includes: `kind`, `code`, `message`, limited `source_chain`, + /// and filtered metadata. No backtrace. + /// + /// # Example Output + /// + /// ```json + /// {"kind":"NotFound","code":"NOT_FOUND","message":"User not found","source_chain":["database error"],"metadata":{"user_id":12345}} + /// ``` + Staging = 2 +} + +impl DisplayMode { + /// Returns the current display mode based on environment configuration. + /// + /// The mode is determined by checking (in order): + /// 1. `MASTERROR_ENV` environment variable (`prod`, `local`, or `staging`) + /// 2. Kubernetes environment detection (`KUBERNETES_SERVICE_HOST`) + /// 3. Build configuration (`cfg!(debug_assertions)`) + /// + /// The result is cached for performance. + /// + /// # Examples + /// + /// ``` + /// use masterror::DisplayMode; + /// + /// let mode = DisplayMode::current(); + /// assert!(matches!( + /// mode, + /// DisplayMode::Prod | DisplayMode::Local | DisplayMode::Staging + /// )); + /// ``` + #[must_use] + pub fn current() -> Self { + static CACHED_MODE: AtomicU8 = AtomicU8::new(255); + let cached = CACHED_MODE.load(Ordering::Relaxed); + if cached != 255 { + return match cached { + 0 => Self::Prod, + 1 => Self::Local, + 2 => Self::Staging, + _ => unreachable!() + }; + } + let mode = Self::detect(); + CACHED_MODE.store(mode as u8, Ordering::Relaxed); + mode + } + + /// Detects the appropriate display mode from environment. + /// + /// This is an internal helper called by [`current()`](Self::current). + pub(crate) fn detect() -> Self { + #[cfg(feature = "std")] + { + use std::env::var; + if let Ok(env) = var("MASTERROR_ENV") { + return match env.as_str() { + "prod" | "production" => Self::Prod, + "local" | "dev" | "development" => Self::Local, + "staging" | "stage" => Self::Staging, + _ => Self::detect_auto() + }; + } + if var("KUBERNETES_SERVICE_HOST").is_ok() { + return Self::Prod; + } + } + Self::detect_auto() + } + + /// Auto-detects mode based on build configuration. + pub(crate) fn detect_auto() -> Self { + if cfg!(debug_assertions) { + Self::Local + } else { + Self::Prod + } + } +} diff --git a/src/app_error/core/display/prod.rs b/src/app_error/core/display/prod.rs new file mode 100644 index 0000000..768505a --- /dev/null +++ b/src/app_error/core/display/prod.rs @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Production mode formatting (compact JSON). + +use core::fmt::{Formatter, Result as FmtResult}; + +use super::helpers::{write_json_escaped, write_metadata_value}; +use crate::{FieldRedaction, MessageEditPolicy, app_error::core::error::Error}; + +#[allow(dead_code)] +impl Error { + /// Formats error in production mode (compact JSON). + /// + /// # Arguments + /// + /// * `f` - Formatter to write output to + /// + /// # Examples + /// + /// ``` + /// use masterror::AppError; + /// + /// let error = AppError::not_found("User not found"); + /// let output = format!("{}", error); + /// // In prod mode: {"kind":"NotFound","code":"NOT_FOUND","message":"User not found"} + /// ``` + #[cfg(not(test))] + pub(crate) fn fmt_prod(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_prod_impl(f) + } + + #[cfg(test)] + #[allow(missing_docs)] + pub fn fmt_prod(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_prod_impl(f) + } + + pub(super) fn fmt_prod_impl(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, r#"{{"kind":"{:?}","code":"{}""#, self.kind, self.code)?; + if !matches!(self.edit_policy, MessageEditPolicy::Redact) + && let Some(msg) = &self.message + { + write!(f, ",\"message\":\"")?; + write_json_escaped(f, msg.as_ref())?; + write!(f, "\"")?; + } + if !self.metadata.is_empty() { + let has_public_fields = self + .metadata + .iter_with_redaction() + .any(|(_, _, redaction)| !matches!(redaction, FieldRedaction::Redact)); + if has_public_fields { + write!(f, r#","metadata":{{"#)?; + let mut first = true; + for (name, value, redaction) in self.metadata.iter_with_redaction() { + if matches!(redaction, FieldRedaction::Redact) { + continue; + } + if !first { + write!(f, ",")?; + } + first = false; + write!(f, r#""{}":"#, name)?; + write_metadata_value(f, value)?; + } + write!(f, "}}")?; + } + } + write!(f, "}}") + } +} diff --git a/src/app_error/core/display/staging.rs b/src/app_error/core/display/staging.rs new file mode 100644 index 0000000..0975f2c --- /dev/null +++ b/src/app_error/core/display/staging.rs @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Staging mode formatting (JSON with context). + +use alloc::string::ToString; +use core::{ + error::Error as CoreError, + fmt::{Formatter, Result as FmtResult} +}; + +use super::helpers::{write_json_escaped, write_metadata_value}; +use crate::{FieldRedaction, MessageEditPolicy, app_error::core::error::Error}; + +#[allow(dead_code)] +impl Error { + /// Formats error in staging mode (JSON with context). + /// + /// # Arguments + /// + /// * `f` - Formatter to write output to + /// + /// # Examples + /// + /// ``` + /// use masterror::AppError; + /// + /// let error = AppError::service("Service unavailable"); + /// let output = format!("{}", error); + /// // In staging mode: JSON with source_chain and metadata + /// ``` + #[cfg(not(test))] + pub(crate) fn fmt_staging(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_staging_impl(f) + } + + #[cfg(test)] + #[allow(missing_docs)] + pub fn fmt_staging(&self, f: &mut Formatter<'_>) -> FmtResult { + self.fmt_staging_impl(f) + } + + pub(super) fn fmt_staging_impl(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, r#"{{"kind":"{:?}","code":"{}""#, self.kind, self.code)?; + if !matches!(self.edit_policy, MessageEditPolicy::Redact) + && let Some(msg) = &self.message + { + write!(f, ",\"message\":\"")?; + write_json_escaped(f, msg.as_ref())?; + write!(f, "\"")?; + } + self.fmt_staging_source_chain(f)?; + self.fmt_staging_metadata(f)?; + write!(f, "}}") + } + + fn fmt_staging_source_chain(&self, f: &mut Formatter<'_>) -> FmtResult { + if let Some(source) = &self.source { + write!(f, r#","source_chain":["#)?; + let mut current: &dyn CoreError = source.as_ref(); + let mut depth = 0; + let mut first = true; + while depth < 5 { + if !first { + write!(f, ",")?; + } + first = false; + write!(f, "\"")?; + write_json_escaped(f, ¤t.to_string())?; + write!(f, "\"")?; + if let Some(next) = current.source() { + current = next; + depth += 1; + } else { + break; + } + } + write!(f, "]")?; + } + Ok(()) + } + + fn fmt_staging_metadata(&self, f: &mut Formatter<'_>) -> FmtResult { + if !self.metadata.is_empty() { + let has_public_fields = self + .metadata + .iter_with_redaction() + .any(|(_, _, redaction)| !matches!(redaction, FieldRedaction::Redact)); + if has_public_fields { + write!(f, r#","metadata":{{"#)?; + let mut first = true; + for (name, value, redaction) in self.metadata.iter_with_redaction() { + if matches!(redaction, FieldRedaction::Redact) { + continue; + } + if !first { + write!(f, ",")?; + } + first = false; + write!(f, r#""{}":"#, name)?; + write_metadata_value(f, value)?; + } + write!(f, "}}")?; + } + } + Ok(()) + } +} diff --git a/src/app_error/core/display/tests.rs b/src/app_error/core/display/tests.rs new file mode 100644 index 0000000..0a15c1c --- /dev/null +++ b/src/app_error/core/display/tests.rs @@ -0,0 +1,383 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Tests for display module. + +use core::fmt::{Formatter, Result as FmtResult}; + +use super::DisplayMode; +use crate::{AppError, field}; + +// ───────────────────────────────────────────────────────────────────────────── +// DisplayMode tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn display_mode_current_returns_valid_mode() { + let mode = DisplayMode::current(); + assert!(matches!( + mode, + DisplayMode::Prod | DisplayMode::Local | DisplayMode::Staging + )); +} + +#[test] +fn display_mode_detect_auto_returns_local_in_debug() { + if cfg!(debug_assertions) { + assert_eq!(DisplayMode::detect_auto(), DisplayMode::Local); + } else { + assert_eq!(DisplayMode::detect_auto(), DisplayMode::Prod); + } +} + +#[test] +fn display_mode_current_caches_result() { + let first = DisplayMode::current(); + let second = DisplayMode::current(); + assert_eq!(first, second); +} + +#[test] +fn display_mode_detect_auto_returns_prod_in_release() { + if !cfg!(debug_assertions) { + assert_eq!(DisplayMode::detect_auto(), DisplayMode::Prod); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Production format tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn fmt_prod_outputs_json() { + let error = AppError::not_found("User not found"); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""kind":"NotFound""#)); + assert!(output.contains(r#""code":"NOT_FOUND""#)); + assert!(output.contains(r#""message":"User not found""#)); +} + +#[test] +fn fmt_prod_excludes_redacted_message() { + let error = AppError::internal("secret").redactable(); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(!output.contains("secret")); +} + +#[test] +fn fmt_prod_includes_metadata() { + let error = AppError::not_found("User not found").with_field(field::u64("user_id", 12345)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""metadata""#)); + assert!(output.contains(r#""user_id":12345"#)); +} + +#[test] +fn fmt_prod_excludes_sensitive_metadata() { + let error = AppError::internal("Error").with_field(field::str("password", "secret")); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(!output.contains("secret")); +} + +#[test] +fn fmt_prod_escapes_special_chars() { + let error = AppError::internal("Line\nwith\"quotes\""); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#"\n"#)); + assert!(output.contains(r#"\""#)); +} + +#[test] +fn fmt_prod_handles_infinity_in_metadata() { + let error = AppError::internal("Error").with_field(field::f64("ratio", f64::INFINITY)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains("null")); +} + +#[test] +fn fmt_prod_formats_duration_metadata() { + use core::time::Duration; + let error = AppError::internal("Error") + .with_field(field::duration("elapsed", Duration::from_millis(1500))); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""secs":1"#)); + assert!(output.contains(r#""nanos":500000000"#)); +} + +#[test] +fn fmt_prod_formats_bool_metadata() { + let error = AppError::internal("Error").with_field(field::bool("active", true)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""active":true"#)); +} + +#[cfg(feature = "std")] +#[test] +fn fmt_prod_formats_ip_metadata() { + use std::net::IpAddr; + let ip: IpAddr = "192.168.1.1".parse().unwrap(); + let error = AppError::internal("Error").with_field(field::ip("client_ip", ip)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""client_ip":"192.168.1.1""#)); +} + +#[test] +fn fmt_prod_formats_uuid_metadata() { + use uuid::Uuid; + let uuid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap(); + let error = AppError::internal("Error").with_field(field::uuid("request_id", uuid)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""request_id":"550e8400-e29b-41d4-a716-446655440000""#)); +} + +#[cfg(feature = "serde_json")] +#[test] +fn fmt_prod_formats_json_metadata() { + let json = serde_json::json!({"nested": "value"}); + let error = AppError::internal("Error").with_field(field::json("data", json)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""data":"#)); +} + +#[test] +fn fmt_prod_without_message() { + let error = AppError::bare(crate::AppErrorKind::Internal); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""kind":"Internal""#)); + assert!(!output.contains(r#""message""#)); +} + +#[test] +fn fmt_prod_with_multiple_metadata_fields() { + let error = AppError::not_found("test") + .with_field(field::str("first", "value1")) + .with_field(field::u64("second", 42)) + .with_field(field::bool("third", true)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""first":"value1""#)); + assert!(output.contains(r#""second":42"#)); + assert!(output.contains(r#""third":true"#)); +} + +#[test] +fn fmt_prod_escapes_backslash() { + let error = AppError::internal("path\\to\\file"); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#"path\\to\\file"#)); +} + +#[test] +fn fmt_prod_with_i64_metadata() { + let error = AppError::internal("test").with_field(field::i64("count", -100)); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""count":-100"#)); +} + +#[test] +fn fmt_prod_with_string_metadata() { + let error = AppError::internal("test").with_field(field::str("name", "value")); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#""name":"value""#)); +} + +#[test] +fn fmt_prod_escapes_control_chars() { + let error = AppError::internal("test\x00\x1F"); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#"\u0000"#)); + assert!(output.contains(r#"\u001f"#)); +} + +#[test] +fn fmt_prod_escapes_tab_and_carriage_return() { + let error = AppError::internal("line\ttab\rreturn"); + let output = format!("{}", error.fmt_prod_wrapper()); + assert!(output.contains(r#"\t"#)); + assert!(output.contains(r#"\r"#)); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Local format tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn fmt_local_outputs_human_readable() { + let error = AppError::not_found("User not found"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("Error:")); + assert!(output.contains("Code: NOT_FOUND") || output.contains("Code:")); + assert!(output.contains("Message: User not found") || output.contains("Message:")); +} + +#[cfg(feature = "std")] +#[test] +fn fmt_local_includes_source_chain() { + use std::io::Error as IoError; + let io_err = IoError::other("connection failed"); + let error = AppError::internal("Database error").with_source(io_err); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("Caused by")); + assert!(output.contains("connection failed")); +} + +#[test] +fn fmt_local_without_message() { + let error = AppError::bare(crate::AppErrorKind::BadRequest); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("Error:")); + assert!(!output.contains("Message:")); +} + +#[test] +fn fmt_local_with_metadata() { + let error = AppError::internal("Error") + .with_field(field::str("key", "value")) + .with_field(field::i64("count", -42)); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("Context:")); + assert!(output.contains("key")); + assert!(output.contains("value") || output.contains("-42")); +} + +#[cfg(feature = "colored")] +#[test] +fn fmt_local_with_deep_source_chain() { + use std::io::{Error as IoError, ErrorKind}; + let io1 = IoError::new(ErrorKind::NotFound, "level 1"); + let io2 = IoError::other(io1); + let error = AppError::internal("top").with_source(io2); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("Caused by")); + assert!(output.contains("level 1")); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Staging format tests +// ───────────────────────────────────────────────────────────────────────────── + +#[test] +fn fmt_staging_outputs_json_with_context() { + let error = AppError::service("Service unavailable"); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""kind":"Service""#)); + assert!(output.contains(r#""code":"SERVICE""#)); +} + +#[cfg(feature = "std")] +#[test] +fn fmt_staging_includes_source_chain() { + use std::io::Error as IoError; + let io_err = IoError::other("timeout"); + let error = AppError::network("Network error").with_source(io_err); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""source_chain""#)); + assert!(output.contains("timeout")); +} + +#[test] +fn fmt_staging_without_message() { + let error = AppError::bare(crate::AppErrorKind::Timeout); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""kind":"Timeout""#)); + assert!(!output.contains(r#""message""#)); +} + +#[test] +fn fmt_staging_with_metadata() { + let error = AppError::service("Service error").with_field(field::u64("retry_count", 3)); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""metadata""#)); + assert!(output.contains(r#""retry_count":3"#)); +} + +#[test] +fn fmt_staging_with_redacted_message() { + let error = AppError::internal("sensitive data").redactable(); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(!output.contains("sensitive data")); +} + +#[test] +fn fmt_staging_with_multiple_metadata_fields() { + let error = AppError::service("error") + .with_field(field::str("key1", "value1")) + .with_field(field::u64("key2", 123)) + .with_field(field::bool("key3", false)); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""key1":"value1""#)); + assert!(output.contains(r#""key2":123"#)); + assert!(output.contains(r#""key3":false"#)); +} + +#[cfg(feature = "std")] +#[test] +fn fmt_staging_with_deep_source_chain() { + use std::io::{Error as IoError, ErrorKind}; + let io1 = IoError::new(ErrorKind::NotFound, "inner error"); + let io2 = IoError::other(io1); + let error = AppError::service("outer").with_source(io2); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""source_chain""#)); + assert!(output.contains("inner error")); +} + +#[test] +fn fmt_staging_with_redacted_and_public_metadata() { + let error = AppError::internal("test") + .with_field(field::str("public", "visible")) + .with_field(field::str("password", "secret")); + let output = format!("{}", error.fmt_staging_wrapper()); + assert!(output.contains(r#""public":"visible""#)); + assert!(!output.contains("secret")); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Helper wrapper for testing +// ───────────────────────────────────────────────────────────────────────────── + +use crate::app_error::core::error::Error; + +impl Error { + fn fmt_prod_wrapper(&self) -> FormatterWrapper<'_> { + FormatterWrapper { + error: self, + mode: FormatterMode::Prod + } + } + + fn fmt_local_wrapper(&self) -> FormatterWrapper<'_> { + FormatterWrapper { + error: self, + mode: FormatterMode::Local + } + } + + fn fmt_staging_wrapper(&self) -> FormatterWrapper<'_> { + FormatterWrapper { + error: self, + mode: FormatterMode::Staging + } + } +} + +enum FormatterMode { + Prod, + Local, + Staging +} + +struct FormatterWrapper<'a> { + error: &'a Error, + mode: FormatterMode +} + +impl core::fmt::Display for FormatterWrapper<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + match self.mode { + FormatterMode::Prod => self.error.fmt_prod(f), + FormatterMode::Local => self.error.fmt_local(f), + FormatterMode::Staging => self.error.fmt_staging(f) + } + } +} From 6183c293c636086e93891a3fa41251947ad84a57 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 12:22:47 +0700 Subject: [PATCH 13/16] refactor: split colored module into focused submodules - mod.rs: module documentation and style re-export - std_style.rs: color styling with owo_colors (std feature) - nostd_style.rs: passthrough styling for no-std - tests.rs: 23 comprehensive tests for both variants --- src/colored.rs | 523 ------------------------------------- src/colored/mod.rs | 103 ++++++++ src/colored/nostd_style.rs | 81 ++++++ src/colored/std_style.rs | 269 +++++++++++++++++++ src/colored/tests.rs | 291 +++++++++++++++++++++ 5 files changed, 744 insertions(+), 523 deletions(-) delete mode 100644 src/colored.rs create mode 100644 src/colored/mod.rs create mode 100644 src/colored/nostd_style.rs create mode 100644 src/colored/std_style.rs create mode 100644 src/colored/tests.rs diff --git a/src/colored.rs b/src/colored.rs deleted file mode 100644 index c5d37df..0000000 --- a/src/colored.rs +++ /dev/null @@ -1,523 +0,0 @@ -// SPDX-FileCopyrightText: 2025-2026 RAprogramm -// -// SPDX-License-Identifier: MIT - -//! Terminal color styling for error output with automatic detection. -//! -//! This module provides zero-cost color styling that automatically detects -//! terminal capabilities and respects environment-based color preferences. -//! -//! # Automatic Color Detection -//! -//! Colors are applied only when all of the following conditions are met: -//! - stderr is connected to a TTY -//! - `NO_COLOR` environment variable is not set -//! - `TERM` is not set to `dumb` -//! - Terminal supports ANSI colors -//! -//! # Platform Support -//! -//! - Linux/Unix: Full ANSI color support -//! - macOS: Full ANSI color support -//! - Windows 10+: Native ANSI support via Windows Terminal -//! - Older Windows: Graceful fallback to monochrome -//! -//! # Color Scheme -//! -//! The color scheme is designed for professional CLI tools: -//! - Critical errors: Red -//! - Warnings: Yellow -//! - Error codes: Cyan (easy to scan) -//! - Messages: Bright white (emphasis) -//! - Source context: Dimmed (secondary information) -//! - Metadata keys: Green (structured data) -//! -//! # Examples -//! -//! ```rust -//! # #[cfg(feature = "colored")] { -//! use masterror::colored::style; -//! -//! let error_text = style::error_kind_critical("ServiceUnavailable"); -//! let code_text = style::error_code("ERR_DB_001"); -//! let msg_text = style::error_message("Database connection failed"); -//! -//! eprintln!("Error: {}", error_text); -//! eprintln!("Code: {}", code_text); -//! eprintln!("{}", msg_text); -//! # } -//! ``` -//! -//! # Integration with Display -//! -//! These functions are designed for use in `Display` implementations: -//! -//! ```rust -//! # #[cfg(feature = "colored")] { -//! use std::fmt; -//! -//! use masterror::colored::style; -//! -//! struct MyError { -//! code: String, -//! message: String -//! } -//! -//! impl fmt::Display for MyError { -//! fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -//! write!( -//! f, -//! "{}: {}", -//! style::error_code(&self.code), -//! style::error_message(&self.message) -//! ) -//! } -//! } -//! # } -//! ``` -//! -//! # Performance -//! -//! Terminal detection is cached per-process, resulting in negligible overhead. -//! Color styling only allocates when colors are actually applied. - -/// Color styling functions with automatic TTY detection. -/// -/// Each function applies appropriate ANSI color codes when stderr supports -/// colors. When colors are not supported, the original text is returned -/// unchanged. -#[cfg(feature = "std")] -pub mod style { - use owo_colors::{OwoColorize, Stream}; - - /// Style critical error kind text in red. - /// - /// Use this for error kinds that indicate critical failures requiring - /// immediate attention. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let styled = style::error_kind_critical("ServiceUnavailable"); - /// eprintln!("Kind: {}", styled); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Red text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn error_kind_critical(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.red()) - .to_string() - } - - /// Style warning-level error kind text in yellow. - /// - /// Use this for error kinds that indicate recoverable issues or warnings. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let styled = style::error_kind_warning("BadRequest"); - /// eprintln!("Kind: {}", styled); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Yellow text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn error_kind_warning(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.yellow()) - .to_string() - } - - /// Style error code text in cyan for easy visual scanning. - /// - /// Use this for machine-readable error codes that users need to reference - /// in documentation or support requests. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let styled = style::error_code("ERR_DATABASE_001"); - /// eprintln!("Code: {}", styled); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Cyan text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn error_code(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.cyan()) - .to_string() - } - - /// Style error message text in bright white for maximum readability. - /// - /// Use this for the primary error message that describes what went wrong. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let styled = style::error_message("Failed to connect to database"); - /// eprintln!("{}", styled); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Bright white text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn error_message(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.bright_white()) - .to_string() - } - - /// Style source context text with dimmed appearance. - /// - /// Use this for error source chains and contextual information that is - /// important but secondary to the main error message. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let styled = style::source_context("Caused by: Connection timeout"); - /// eprintln!("{}", styled); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Dimmed text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn source_context(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.dimmed()) - .to_string() - } - - /// Style metadata key text in green. - /// - /// Use this for structured metadata keys in error context to visually - /// separate keys from values. - /// - /// # Examples - /// - /// ```rust - /// # #[cfg(feature = "colored")] { - /// use masterror::colored::style; - /// - /// let key = style::metadata_key("request_id"); - /// eprintln!("{}: abc123", key); - /// # } - /// ``` - /// - /// # Color Behavior - /// - /// - TTY: Green text - /// - Non-TTY: Plain text - /// - NO_COLOR=1: Plain text - pub fn metadata_key(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.green()) - .to_string() - } - - // ───────────────────────────────────────────────────────────────────────── - // Diagnostic styling - // ───────────────────────────────────────────────────────────────────────── - - /// Style hint label in blue. - /// - /// # Color Behavior - /// - /// - TTY: Blue text - /// - Non-TTY: Plain text - pub fn hint_label(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.blue()) - .to_string() - } - - /// Style hint message in bright blue. - /// - /// # Color Behavior - /// - /// - TTY: Bright blue text - /// - Non-TTY: Plain text - pub fn hint_text(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.bright_blue()) - .to_string() - } - - /// Style suggestion label in magenta. - /// - /// # Color Behavior - /// - /// - TTY: Magenta text - /// - Non-TTY: Plain text - pub fn suggestion_label(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.magenta()) - .to_string() - } - - /// Style suggestion message in bright magenta. - /// - /// # Color Behavior - /// - /// - TTY: Bright magenta text - /// - Non-TTY: Plain text - pub fn suggestion_text(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.bright_magenta()) - .to_string() - } - - /// Style command/code snippet in bold bright white. - /// - /// # Color Behavior - /// - /// - TTY: Bold bright white text - /// - Non-TTY: Plain text - pub fn command(text: impl AsRef) -> String { - use owo_colors::Style; - let style = Style::new().bold().bright_white(); - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.style(style)) - .to_string() - } - - /// Style documentation link label in cyan. - /// - /// # Color Behavior - /// - /// - TTY: Cyan text - /// - Non-TTY: Plain text - pub fn docs_label(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.cyan()) - .to_string() - } - - /// Style URL in underlined cyan. - /// - /// # Color Behavior - /// - /// - TTY: Underlined cyan text - /// - Non-TTY: Plain text - pub fn url(text: impl AsRef) -> String { - use owo_colors::Style; - let style = Style::new().underline().cyan(); - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.style(style)) - .to_string() - } - - /// Style "see also" label in dimmed text. - /// - /// # Color Behavior - /// - /// - TTY: Dimmed text - /// - Non-TTY: Plain text - pub fn related_label(text: impl AsRef) -> String { - text.as_ref() - .if_supports_color(Stream::Stderr, |t| t.dimmed()) - .to_string() - } -} - -/// No-op styling for no-std builds. -#[cfg(not(feature = "std"))] -pub mod style { - /// Style critical error kind text in red. - pub fn error_kind_critical(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style warning-level error kind text in yellow. - pub fn error_kind_warning(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style error code text in cyan for easy visual scanning. - pub fn error_code(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style error message text in bright white for maximum readability. - pub fn error_message(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style source context text with dimmed appearance. - pub fn source_context(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style metadata key text in green. - pub fn metadata_key(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style hint label. - pub fn hint_label(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style hint message. - pub fn hint_text(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style suggestion label. - pub fn suggestion_label(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style suggestion message. - pub fn suggestion_text(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style command/code snippet. - pub fn command(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style documentation link label. - pub fn docs_label(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style URL. - pub fn url(text: impl AsRef) -> String { - text.as_ref().to_string() - } - - /// Style "see also" label. - pub fn related_label(text: impl AsRef) -> String { - text.as_ref().to_string() - } -} - -#[cfg(all(test, not(feature = "std")))] -mod nostd_tests { - use super::style; - - #[test] - fn error_kind_critical_returns_plain_text() { - assert_eq!(style::error_kind_critical("test"), "test"); - } - - #[test] - fn error_kind_warning_returns_plain_text() { - assert_eq!(style::error_kind_warning("test"), "test"); - } - - #[test] - fn error_code_returns_plain_text() { - assert_eq!(style::error_code("ERR_001"), "ERR_001"); - } - - #[test] - fn error_message_returns_plain_text() { - assert_eq!(style::error_message("message"), "message"); - } - - #[test] - fn source_context_returns_plain_text() { - assert_eq!(style::source_context("context"), "context"); - } - - #[test] - fn metadata_key_returns_plain_text() { - assert_eq!(style::metadata_key("key"), "key"); - } -} - -#[cfg(all(test, feature = "std"))] -mod tests { - use super::style; - - #[test] - fn error_kind_critical_produces_output() { - let result = style::error_kind_critical("ServiceUnavailable"); - assert!(!result.is_empty()); - assert!(result.contains("ServiceUnavailable")); - } - - #[test] - fn error_kind_warning_produces_output() { - let result = style::error_kind_warning("BadRequest"); - assert!(!result.is_empty()); - assert!(result.contains("BadRequest")); - } - - #[test] - fn error_code_produces_output() { - let result = style::error_code("ERR_001"); - assert!(!result.is_empty()); - assert!(result.contains("ERR_001")); - } - - #[test] - fn error_message_produces_output() { - let result = style::error_message("Connection failed"); - assert!(!result.is_empty()); - assert!(result.contains("Connection failed")); - } - - #[test] - fn source_context_produces_output() { - let result = style::source_context("Caused by: timeout"); - assert!(!result.is_empty()); - assert!(result.contains("Caused by: timeout")); - } - - #[test] - fn metadata_key_produces_output() { - let result = style::metadata_key("request_id"); - assert!(!result.is_empty()); - assert!(result.contains("request_id")); - } - - #[test] - fn style_functions_preserve_content() { - let input = "test content with special chars: äöü"; - assert!(style::error_kind_critical(input).contains(input)); - assert!(style::error_kind_warning(input).contains(input)); - assert!(style::error_code(input).contains(input)); - assert!(style::error_message(input).contains(input)); - assert!(style::source_context(input).contains(input)); - assert!(style::metadata_key(input).contains(input)); - } -} diff --git a/src/colored/mod.rs b/src/colored/mod.rs new file mode 100644 index 0000000..9b8c0c2 --- /dev/null +++ b/src/colored/mod.rs @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Terminal color styling for error output with automatic detection. +//! +//! This module provides zero-cost color styling that automatically detects +//! terminal capabilities and respects environment-based color preferences. +//! +//! # Automatic Color Detection +//! +//! Colors are applied only when all of the following conditions are met: +//! - stderr is connected to a TTY +//! - `NO_COLOR` environment variable is not set +//! - `TERM` is not set to `dumb` +//! - Terminal supports ANSI colors +//! +//! # Platform Support +//! +//! - Linux/Unix: Full ANSI color support +//! - macOS: Full ANSI color support +//! - Windows 10+: Native ANSI support via Windows Terminal +//! - Older Windows: Graceful fallback to monochrome +//! +//! # Color Scheme +//! +//! The color scheme is designed for professional CLI tools: +//! - Critical errors: Red +//! - Warnings: Yellow +//! - Error codes: Cyan (easy to scan) +//! - Messages: Bright white (emphasis) +//! - Source context: Dimmed (secondary information) +//! - Metadata keys: Green (structured data) +//! +//! # Examples +//! +//! ```rust +//! # #[cfg(feature = "colored")] { +//! use masterror::colored::style; +//! +//! let error_text = style::error_kind_critical("ServiceUnavailable"); +//! let code_text = style::error_code("ERR_DB_001"); +//! let msg_text = style::error_message("Database connection failed"); +//! +//! eprintln!("Error: {}", error_text); +//! eprintln!("Code: {}", code_text); +//! eprintln!("{}", msg_text); +//! # } +//! ``` +//! +//! # Integration with Display +//! +//! These functions are designed for use in `Display` implementations: +//! +//! ```rust +//! # #[cfg(feature = "colored")] { +//! use std::fmt; +//! +//! use masterror::colored::style; +//! +//! struct MyError { +//! code: String, +//! message: String +//! } +//! +//! impl fmt::Display for MyError { +//! fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +//! write!( +//! f, +//! "{}: {}", +//! style::error_code(&self.code), +//! style::error_message(&self.message) +//! ) +//! } +//! } +//! # } +//! ``` +//! +//! # Performance +//! +//! Terminal detection is cached per-process, resulting in negligible overhead. +//! Color styling only allocates when colors are actually applied. + +#[cfg(feature = "std")] +mod std_style; + +#[cfg(not(feature = "std"))] +mod nostd_style; + +#[cfg(test)] +mod tests; + +/// Color styling functions with automatic TTY detection. +/// +/// Each function applies appropriate ANSI color codes when stderr supports +/// colors. When colors are not supported, the original text is returned +/// unchanged. +pub mod style { + #[cfg(not(feature = "std"))] + pub use super::nostd_style::*; + #[cfg(feature = "std")] + pub use super::std_style::*; +} diff --git a/src/colored/nostd_style.rs b/src/colored/nostd_style.rs new file mode 100644 index 0000000..2cad6e3 --- /dev/null +++ b/src/colored/nostd_style.rs @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! No-op styling functions for no-std builds. +//! +//! All functions return the input text unchanged, providing API compatibility +//! with the std feature while avoiding any allocations beyond string +//! conversion. + +use alloc::string::{String, ToString}; + +/// Style critical error kind text in red. +pub fn error_kind_critical(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style warning-level error kind text in yellow. +pub fn error_kind_warning(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style error code text in cyan for easy visual scanning. +pub fn error_code(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style error message text in bright white for maximum readability. +pub fn error_message(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style source context text with dimmed appearance. +pub fn source_context(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style metadata key text in green. +pub fn metadata_key(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style hint label. +pub fn hint_label(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style hint message. +pub fn hint_text(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style suggestion label. +pub fn suggestion_label(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style suggestion message. +pub fn suggestion_text(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style command/code snippet. +pub fn command(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style documentation link label. +pub fn docs_label(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style URL. +pub fn url(text: impl AsRef) -> String { + text.as_ref().to_string() +} + +/// Style "see also" label. +pub fn related_label(text: impl AsRef) -> String { + text.as_ref().to_string() +} diff --git a/src/colored/std_style.rs b/src/colored/std_style.rs new file mode 100644 index 0000000..80ee422 --- /dev/null +++ b/src/colored/std_style.rs @@ -0,0 +1,269 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Color styling functions using owo_colors with automatic TTY detection. + +use owo_colors::{OwoColorize, Stream, Style}; + +/// Style critical error kind text in red. +/// +/// Use this for error kinds that indicate critical failures requiring +/// immediate attention. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let styled = style::error_kind_critical("ServiceUnavailable"); +/// eprintln!("Kind: {}", styled); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Red text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn error_kind_critical(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.red()) + .to_string() +} + +/// Style warning-level error kind text in yellow. +/// +/// Use this for error kinds that indicate recoverable issues or warnings. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let styled = style::error_kind_warning("BadRequest"); +/// eprintln!("Kind: {}", styled); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Yellow text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn error_kind_warning(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.yellow()) + .to_string() +} + +/// Style error code text in cyan for easy visual scanning. +/// +/// Use this for machine-readable error codes that users need to reference +/// in documentation or support requests. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let styled = style::error_code("ERR_DATABASE_001"); +/// eprintln!("Code: {}", styled); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Cyan text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn error_code(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.cyan()) + .to_string() +} + +/// Style error message text in bright white for maximum readability. +/// +/// Use this for the primary error message that describes what went wrong. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let styled = style::error_message("Failed to connect to database"); +/// eprintln!("{}", styled); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Bright white text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn error_message(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.bright_white()) + .to_string() +} + +/// Style source context text with dimmed appearance. +/// +/// Use this for error source chains and contextual information that is +/// important but secondary to the main error message. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let styled = style::source_context("Caused by: Connection timeout"); +/// eprintln!("{}", styled); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Dimmed text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn source_context(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.dimmed()) + .to_string() +} + +/// Style metadata key text in green. +/// +/// Use this for structured metadata keys in error context to visually +/// separate keys from values. +/// +/// # Examples +/// +/// ```rust +/// # #[cfg(feature = "colored")] { +/// use masterror::colored::style; +/// +/// let key = style::metadata_key("request_id"); +/// eprintln!("{}: abc123", key); +/// # } +/// ``` +/// +/// # Color Behavior +/// +/// - TTY: Green text +/// - Non-TTY: Plain text +/// - NO_COLOR=1: Plain text +pub fn metadata_key(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.green()) + .to_string() +} + +// ───────────────────────────────────────────────────────────────────────────── +// Diagnostic styling +// ───────────────────────────────────────────────────────────────────────────── + +/// Style hint label in blue. +/// +/// # Color Behavior +/// +/// - TTY: Blue text +/// - Non-TTY: Plain text +pub fn hint_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.blue()) + .to_string() +} + +/// Style hint message in bright blue. +/// +/// # Color Behavior +/// +/// - TTY: Bright blue text +/// - Non-TTY: Plain text +pub fn hint_text(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.bright_blue()) + .to_string() +} + +/// Style suggestion label in magenta. +/// +/// # Color Behavior +/// +/// - TTY: Magenta text +/// - Non-TTY: Plain text +pub fn suggestion_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.magenta()) + .to_string() +} + +/// Style suggestion message in bright magenta. +/// +/// # Color Behavior +/// +/// - TTY: Bright magenta text +/// - Non-TTY: Plain text +pub fn suggestion_text(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.bright_magenta()) + .to_string() +} + +/// Style command/code snippet in bold bright white. +/// +/// # Color Behavior +/// +/// - TTY: Bold bright white text +/// - Non-TTY: Plain text +pub fn command(text: impl AsRef) -> String { + let style = Style::new().bold().bright_white(); + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.style(style)) + .to_string() +} + +/// Style documentation link label in cyan. +/// +/// # Color Behavior +/// +/// - TTY: Cyan text +/// - Non-TTY: Plain text +pub fn docs_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.cyan()) + .to_string() +} + +/// Style URL in underlined cyan. +/// +/// # Color Behavior +/// +/// - TTY: Underlined cyan text +/// - Non-TTY: Plain text +pub fn url(text: impl AsRef) -> String { + let style = Style::new().underline().cyan(); + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.style(style)) + .to_string() +} + +/// Style "see also" label in dimmed text. +/// +/// # Color Behavior +/// +/// - TTY: Dimmed text +/// - Non-TTY: Plain text +pub fn related_label(text: impl AsRef) -> String { + text.as_ref() + .if_supports_color(Stream::Stderr, |t| t.dimmed()) + .to_string() +} diff --git a/src/colored/tests.rs b/src/colored/tests.rs new file mode 100644 index 0000000..4e14a54 --- /dev/null +++ b/src/colored/tests.rs @@ -0,0 +1,291 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! Tests for colored styling module. + +#[cfg(feature = "std")] +mod std_tests { + use crate::colored::style::*; + + // ───────────────────────────────────────────────────────────────────────── + // Basic error styling tests + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn error_kind_critical_produces_output() { + let result = error_kind_critical("ServiceUnavailable"); + assert!(!result.is_empty()); + assert!(result.contains("ServiceUnavailable")); + } + + #[test] + fn error_kind_warning_produces_output() { + let result = error_kind_warning("BadRequest"); + assert!(!result.is_empty()); + assert!(result.contains("BadRequest")); + } + + #[test] + fn error_code_produces_output() { + let result = error_code("ERR_001"); + assert!(!result.is_empty()); + assert!(result.contains("ERR_001")); + } + + #[test] + fn error_message_produces_output() { + let result = error_message("Connection failed"); + assert!(!result.is_empty()); + assert!(result.contains("Connection failed")); + } + + #[test] + fn source_context_produces_output() { + let result = source_context("Caused by: timeout"); + assert!(!result.is_empty()); + assert!(result.contains("Caused by: timeout")); + } + + #[test] + fn metadata_key_produces_output() { + let result = metadata_key("request_id"); + assert!(!result.is_empty()); + assert!(result.contains("request_id")); + } + + // ───────────────────────────────────────────────────────────────────────── + // Diagnostic styling tests + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn hint_label_produces_output() { + let result = hint_label("hint"); + assert!(!result.is_empty()); + assert!(result.contains("hint")); + } + + #[test] + fn hint_text_produces_output() { + let result = hint_text("Try restarting the service"); + assert!(!result.is_empty()); + assert!(result.contains("Try restarting the service")); + } + + #[test] + fn suggestion_label_produces_output() { + let result = suggestion_label("suggestion"); + assert!(!result.is_empty()); + assert!(result.contains("suggestion")); + } + + #[test] + fn suggestion_text_produces_output() { + let result = suggestion_text("Run cargo clean"); + assert!(!result.is_empty()); + assert!(result.contains("Run cargo clean")); + } + + #[test] + fn command_produces_output() { + let result = command("cargo build --release"); + assert!(!result.is_empty()); + assert!(result.contains("cargo build --release")); + } + + #[test] + fn docs_label_produces_output() { + let result = docs_label("docs"); + assert!(!result.is_empty()); + assert!(result.contains("docs")); + } + + #[test] + fn url_produces_output() { + let result = url("https://docs.rs/masterror"); + assert!(!result.is_empty()); + assert!(result.contains("https://docs.rs/masterror")); + } + + #[test] + fn related_label_produces_output() { + let result = related_label("see also"); + assert!(!result.is_empty()); + assert!(result.contains("see also")); + } + + // ───────────────────────────────────────────────────────────────────────── + // Content preservation tests + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn all_style_functions_preserve_content() { + let input = "test content with special chars: äöü"; + assert!(error_kind_critical(input).contains(input)); + assert!(error_kind_warning(input).contains(input)); + assert!(error_code(input).contains(input)); + assert!(error_message(input).contains(input)); + assert!(source_context(input).contains(input)); + assert!(metadata_key(input).contains(input)); + } + + #[test] + fn diagnostic_functions_preserve_content() { + let input = "content with unicode: 日本語"; + assert!(hint_label(input).contains(input)); + assert!(hint_text(input).contains(input)); + assert!(suggestion_label(input).contains(input)); + assert!(suggestion_text(input).contains(input)); + assert!(command(input).contains(input)); + assert!(docs_label(input).contains(input)); + assert!(url(input).contains(input)); + assert!(related_label(input).contains(input)); + } + + // ───────────────────────────────────────────────────────────────────────── + // Edge case tests + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn empty_string_returns_empty() { + assert!(error_kind_critical("").is_empty() || error_kind_critical("").contains("")); + assert!(error_code("").is_empty() || error_code("").contains("")); + assert!(command("").is_empty() || command("").contains("")); + } + + #[test] + fn whitespace_preserved() { + let input = " spaced text "; + assert!(error_message(input).contains(input)); + assert!(hint_text(input).contains(input)); + } + + #[test] + fn newlines_preserved() { + let input = "line1\nline2\nline3"; + assert!(error_message(input).contains(input)); + assert!(suggestion_text(input).contains(input)); + } + + #[test] + fn special_chars_preserved() { + let input = "path/to/file.rs:42:13"; + assert!(error_message(input).contains(input)); + assert!(source_context(input).contains(input)); + } + + #[test] + fn ansi_escape_sequences_in_input_preserved() { + let input = "\x1b[31mred\x1b[0m"; + let result = error_message(input); + assert!(result.contains("red")); + } +} + +#[cfg(not(feature = "std"))] +mod nostd_tests { + use crate::colored::style::*; + + // ───────────────────────────────────────────────────────────────────────── + // Basic styling returns plain text + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn error_kind_critical_returns_plain_text() { + assert_eq!(error_kind_critical("test"), "test"); + } + + #[test] + fn error_kind_warning_returns_plain_text() { + assert_eq!(error_kind_warning("test"), "test"); + } + + #[test] + fn error_code_returns_plain_text() { + assert_eq!(error_code("ERR_001"), "ERR_001"); + } + + #[test] + fn error_message_returns_plain_text() { + assert_eq!(error_message("message"), "message"); + } + + #[test] + fn source_context_returns_plain_text() { + assert_eq!(source_context("context"), "context"); + } + + #[test] + fn metadata_key_returns_plain_text() { + assert_eq!(metadata_key("key"), "key"); + } + + // ───────────────────────────────────────────────────────────────────────── + // Diagnostic styling returns plain text + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn hint_label_returns_plain_text() { + assert_eq!(hint_label("hint"), "hint"); + } + + #[test] + fn hint_text_returns_plain_text() { + assert_eq!(hint_text("help text"), "help text"); + } + + #[test] + fn suggestion_label_returns_plain_text() { + assert_eq!(suggestion_label("suggestion"), "suggestion"); + } + + #[test] + fn suggestion_text_returns_plain_text() { + assert_eq!(suggestion_text("try this"), "try this"); + } + + #[test] + fn command_returns_plain_text() { + assert_eq!(command("cargo build"), "cargo build"); + } + + #[test] + fn docs_label_returns_plain_text() { + assert_eq!(docs_label("docs"), "docs"); + } + + #[test] + fn url_returns_plain_text() { + assert_eq!(url("https://example.com"), "https://example.com"); + } + + #[test] + fn related_label_returns_plain_text() { + assert_eq!(related_label("see also"), "see also"); + } + + // ───────────────────────────────────────────────────────────────────────── + // Edge cases + // ───────────────────────────────────────────────────────────────────────── + + #[test] + fn empty_string_returns_empty() { + assert_eq!(error_kind_critical(""), ""); + assert_eq!(error_code(""), ""); + assert_eq!(command(""), ""); + } + + #[test] + fn unicode_preserved() { + let input = "エラー: 日本語テスト"; + assert_eq!(error_message(input), input); + assert_eq!(hint_text(input), input); + } + + #[test] + fn special_chars_preserved() { + let input = "file.rs:42:13 -> error"; + assert_eq!(source_context(input), input); + assert_eq!(suggestion_text(input), input); + } +} From 70042ce432787b90638a600d9dd45b66f569193c Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 12:28:33 +0700 Subject: [PATCH 14/16] test: add local format diagnostics tests for higher coverage - Add tests for hints, suggestions, doc links, related codes in local format - Improve local.rs coverage from 46% to 92% - Note: env-based mode detection tests omitted due to #![deny(unsafe_code)] --- src/app_error/core/display/tests.rs | 68 +++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/app_error/core/display/tests.rs b/src/app_error/core/display/tests.rs index 0a15c1c..128bd5b 100644 --- a/src/app_error/core/display/tests.rs +++ b/src/app_error/core/display/tests.rs @@ -45,6 +45,11 @@ fn display_mode_detect_auto_returns_prod_in_release() { } } +// Note: Environment-based mode detection tests (MASTERROR_ENV, +// KUBERNETES_SERVICE_HOST) cannot be tested without unsafe env var manipulation +// which is forbidden by #![deny(unsafe_code)]. These code paths are tested via +// integration tests and manual verification. + // ───────────────────────────────────────────────────────────────────────────── // Production format tests // ───────────────────────────────────────────────────────────────────────────── @@ -252,6 +257,69 @@ fn fmt_local_with_deep_source_chain() { assert!(output.contains("level 1")); } +#[test] +fn fmt_local_with_hints() { + let error = AppError::not_found("Resource missing") + .with_hint("Check the resource ID") + .with_hint("Verify permissions"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("hint")); + assert!(output.contains("Check the resource ID")); +} + +#[test] +fn fmt_local_with_suggestions() { + let error = AppError::service("Service unavailable") + .with_suggestion("Retry the request") + .with_suggestion_cmd("Check service status", "systemctl status myservice"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("suggestion")); + assert!(output.contains("Retry the request")); + assert!(output.contains("systemctl status myservice")); +} + +#[test] +fn fmt_local_with_doc_link() { + let error = AppError::unauthorized("Authentication required") + .with_docs("https://docs.example.com/auth"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("docs")); + assert!(output.contains("https://docs.example.com/auth")); +} + +#[test] +fn fmt_local_with_doc_link_titled() { + let error = AppError::forbidden("Access denied") + .with_docs_titled("https://docs.example.com/rbac", "RBAC Guide"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("docs")); + assert!(output.contains("RBAC Guide")); +} + +#[test] +fn fmt_local_with_related_codes() { + let error = AppError::database_with_message("Connection failed") + .with_related_code("DB_POOL_EXHAUSTED") + .with_related_code("DB_TIMEOUT"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("see also")); + assert!(output.contains("DB_POOL_EXHAUSTED")); +} + +#[test] +fn fmt_local_with_all_diagnostics() { + let error = AppError::internal("Critical failure") + .with_hint("Check logs for details") + .with_suggestion_cmd("View logs", "journalctl -u myapp") + .with_docs_titled("https://docs.example.com/troubleshoot", "Troubleshooting") + .with_related_code("ERR_STARTUP_FAILED"); + let output = format!("{}", error.fmt_local_wrapper()); + assert!(output.contains("hint")); + assert!(output.contains("suggestion")); + assert!(output.contains("docs")); + assert!(output.contains("see also")); +} + // ───────────────────────────────────────────────────────────────────────────── // Staging format tests // ───────────────────────────────────────────────────────────────────────────── From 65125cd376ee11e3af67b4922715b4243e8c9445 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sat, 24 Jan 2026 12:35:14 +0700 Subject: [PATCH 15/16] docs: add masterror-knowledge README and update CLI links - Add README.md for masterror-knowledge with learning curve image - Add masterror-knowledge to workspace crates table - Update masterror-cli description with install instructions - Add CLI links to Russian and Korean READMEs --- README.ko.md | 2 + README.md | 3 +- README.ru.md | 2 + README.template.md | 3 +- images/masterror-knowledge.png | Bin 0 -> 1375994 bytes images/masterror-knowledge.png.license | 3 + masterror-knowledge/README.md | 88 +++++++++++++++++++++++++ 7 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 images/masterror-knowledge.png create mode 100644 images/masterror-knowledge.png.license create mode 100644 masterror-knowledge/README.md diff --git a/README.ko.md b/README.ko.md index 0fe7d7d..16d27a2 100644 --- a/README.ko.md +++ b/README.ko.md @@ -25,6 +25,8 @@ SPDX-License-Identifier: MIT > 🇬🇧 [Read README in English](README.md) > 🇷🇺 [Читайте README на русском языке](README.ru.md) + **참고:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) — Rust 컴파일러 오류를 상세한 해결책, 모범 사례 및 다국어 지원과 함께 설명하는 CLI 도구입니다. `cargo install masterror-cli` 또는 [AUR](https://aur.archlinux.org/packages/masterror-cli)에서 설치하세요. + > [!IMPORTANT] diff --git a/README.md b/README.md index 97c2057..5f743c3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ SPDX-License-Identifier: MIT > 🇷🇺 [Читайте README на русском языке](README.ru.md) > 🇰🇷 [한국어 README](README.ko.md) - **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) - CLI tool for explaining Rust compiler errors + **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) — CLI tool that explains Rust compiler errors with detailed solutions, best practices, and multi-language support. Install via `cargo install masterror-cli` or from [AUR](https://aur.archlinux.org/packages/masterror-cli). @@ -115,6 +115,7 @@ of redaction and metadata. | [`masterror`](https://crates.io/crates/masterror) | Core error types, metadata builders, transports, integrations and the prelude. | Application crates, services and libraries that want a stable error surface. | | [`masterror-derive`](masterror-derive/README.md) | Proc-macros backing `#[derive(Error)]`, `#[derive(Masterror)]`, `#[app_error]` and `#[provide]`. | Brought in automatically via `masterror`; depend directly only for macro hacking. | | [`masterror-template`](masterror-template/README.md) | Shared template parser used by the derive macros for formatter analysis. | Internal dependency; reuse when you need the template parser elsewhere. | +| [`masterror-knowledge`](masterror-knowledge/README.md) | Knowledge base with 31+ error explanations and 15 best practices in 3 languages. | Used by [masterror-cli](https://github.com/RAprogramm/masterror-cli); depend directly for custom tooling. |
diff --git a/README.ru.md b/README.ru.md index a1c46b9..dd377a8 100644 --- a/README.ru.md +++ b/README.ru.md @@ -25,6 +25,8 @@ SPDX-License-Identifier: MIT > 🇬🇧 [Read README in English](README.md) > 🇰🇷 [한국어 README](README.ko.md) + **См. также:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) — CLI-инструмент для объяснения ошибок компилятора Rust с подробными решениями, лучшими практиками и поддержкой нескольких языков. Установка: `cargo install masterror-cli` или из [AUR](https://aur.archlinux.org/packages/masterror-cli). +
> [!IMPORTANT] diff --git a/README.template.md b/README.template.md index 6f35b19..98e09e8 100644 --- a/README.template.md +++ b/README.template.md @@ -26,7 +26,7 @@ SPDX-License-Identifier: MIT > 🇷🇺 [Читайте README на русском языке](README.ru.md) > 🇰🇷 [한국어 README](README.ko.md) - **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) - CLI tool for explaining Rust compiler errors + **See also:** [masterror-cli](https://github.com/RAprogramm/masterror-cli) — CLI tool that explains Rust compiler errors with detailed solutions, best practices, and multi-language support. Install via `cargo install masterror-cli` or from [AUR](https://aur.archlinux.org/packages/masterror-cli). @@ -115,6 +115,7 @@ of redaction and metadata. | [`masterror`](https://crates.io/crates/masterror) | Core error types, metadata builders, transports, integrations and the prelude. | Application crates, services and libraries that want a stable error surface. | | [`masterror-derive`](masterror-derive/README.md) | Proc-macros backing `#[derive(Error)]`, `#[derive(Masterror)]`, `#[app_error]` and `#[provide]`. | Brought in automatically via `masterror`; depend directly only for macro hacking. | | [`masterror-template`](masterror-template/README.md) | Shared template parser used by the derive macros for formatter analysis. | Internal dependency; reuse when you need the template parser elsewhere. | +| [`masterror-knowledge`](masterror-knowledge/README.md) | Knowledge base with 31+ error explanations and 15 best practices in 3 languages. | Used by [masterror-cli](https://github.com/RAprogramm/masterror-cli); depend directly for custom tooling. |
diff --git a/images/masterror-knowledge.png b/images/masterror-knowledge.png new file mode 100644 index 0000000000000000000000000000000000000000..31baba77d4e41d8961653f85f01a2fe53bbcb900 GIT binary patch literal 1375994 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 FK8a#PFFBQ9>h-0r|q@4kwsl{KCU- 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 z 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�alTW=4F|p#i=-GhQyW-_lb7T=;tH%OaqLK)vhv zv=D$4;Uab$LdcAz@@SD)5+W#t99&MTBdlvFh21@kDB6se%w3pM*B~kY0SY#Zg`{%c zdsvv6APkbQY|g}`2zW?gO)1)pxDcT*Sv)IGm@5J|XF*qRwX(2C+4tUBM}&1=y0im5To1m zy49uNgs+1jk70l?dUi@iDFVr~L0nHu0Jyt|xJOn^>2MJ)MV4iOa1q|O2EfEfKq3r| zNxabE>#2qra`xg;-juVis_i{JOPRtiRa#3f5T_!T;MZ_~h-}(Ao!5*_BO((f(y|mz z*+_@#m<{)c(3{?`ixfsG5fddzgup3m1M(a%+&x|RB7(#`vkJWL?a=!mAl9Ycu3N3u zv>~CTt;h@k>QYOQzV|G#Dn*v1AYt>40BJEH#@rLmT|^;O3y<_c^){re%t6eix~#Rg zk%DM??Kt;@=8hf!+ifT2X%!=65gkK{jBZ)7n^S}w6-z1gvDeGWP1r>{z+yj<^V|uka}R41u-247|1>^Y#0M=TCE%jQ;+6pIg96K zG)Mnqa3;hw=M&9_=0h7lmIQ}`C%rd5p=uc@AP=7}6wo|jq>7F}K)L6cYX9`#1OPk- z8{{Jfd^oK3ho9&9aPVx|IWRu?5Ao4I2l((%b-a}DZ1j2lZgc4|&meg`isxti;ZOST zV3ECA0P#%T$jp0=v+e)^kGFo^`^&YsMp?uidQ(Cyg?qP@oqB8ccbCyes#fSxiXci^ zWP9p?IEGRlrn4{RB-*|0BX^pk+j3e)Q|-Y_gwVSU9mL2&ZR;dN!o76_D2w#w4jACX z431rgnQ~cr)3Qhew0%!Ms|cFMXjUtau47nT3WWEqmr@9+_aPib8TeOXFwV04Uhj1dbH zwchJ_4W!$?kI_H>i5Gw7U;e>A```Y77ggGAYwn0tYIXD8v@Bdo8BIwNC_xdBx5Kuz zaIOm{=`6v2y^T`EBlcTgPu0}97FD3Y(`D_uY6~f#tqF5D-Ys<9$KUw!Z~mp9{gt18 z`&9tm-JR$#7tNj#0<}16|FM_w2iJ&gn2-asU5UxV_nWeiU@WWbd)zdZ5n~?&xL!oB z!vG$xdS2<}UEOYdJud|A;rEy2{r7G|<$Pu$GVM&b@BYE2cXt)FyG1?mcI#~)m%H_L z8`sIm@-+p(0x}NXuv^y7he6^qNYgyPv zL`2(lJxL@@TzCvy&kPFNRauZ2pB}dLTv{7UR0`c5yA+azo*wpkF5$Lad*3t)(o)yU zxtxLpVXb9ZUVZ&rzBgk2BmdgJ^0`0#uj|7Hp^7LLNGo3-p89(avHkKpzy7O5B+C}I zr*U^#Zr6rprE>Rp@y6-BZ(ou4V{e?^|MpXn;u=!vQx{p@iwBJa&0$LNNC_;OWvlLa zvme9Kdf^GD1j~N_0LmuCFvOXead)>UizH!FhbAxpg#mF4EvZxGCEXnWue&xiW^{nP z84)mYHV>%9P%Bl&?#_fMvfMCPT@&0acfW3JHlqyKrZWicw_f;6VP`{a3 zl*&ZZGhEOhAWCHbY(sCG*BY(2S5LQXYp3(lhX%s7tEwU6Q0>E(yAmD`A8eQVWp71KnNHF``&9UncvDT-VsjI zSrEy7i2#T&jfk{KMDN2?v&enuKtSjtNzsUa2#Ig5Ra_kc@|)~?N5oo+4&6tSBDL1h zHMyduzAR#DZoZtV4x4iTgc+EQuJX1<*2=*EQzCv3_bm}2x1 zkPw2%8*{#Yh-u%(vKBY%HZuQ>hpQ~xSY3TN)duDeA zT}zdK(5?_sYDtl@l+ybcV<4a@L?&VbATaB+lX1D6%64sBgqXIiUFekP`t`hweMCm& zg|+LmBAfH54mZo}z7f$FBQ4zkslmtIIx^j^NybA67^>kj6yfHjO7E&_5peAKL{;4~ z9%{*kGD{&A5s+85VeV0C*|)ZwDgqL5+dDI7SI_8HDrfQ`JC{Zu6EkQ&wSV(ci<^s( zNZq$K%aYZ?osz7jCc<_&F#u83=iQE_$b|*tA1fqgNRbf=((N9uIPL^NrR8f7f(NWzAj9v=B84LrU7`` zT_Pv@@LpS^JL5%SVJb0Q+* zT>1eX9IzxgQ*LBD0&x};;4|YsgTe=uCk2cQFl2Pi!*N>U@|(bn1o(W3Qbx&k;pcCd z#RZ9(N}v!PMF**VWONvxjW$R3a30n2Ip*a3{6Zn39CADUGZX)z%Flz*VaPdV`j0w- z;7A4>7AZV@S1~94<9G1k!T_i9=LiuTXOQ`z;UoAUB2dkjMkCxjn2?D9!4Uz02-WSD zIU6A)1UDpxYy|f-z=4{XIS@-lDOngv+f8kFU5j~k%X^Zl0kZBMv!Y8xqzEKA%c8Y` zgb-dA>1`NVslruEjZ6Lt3CSpXxeNEEZjlFb7M3d8wdok{wk!)05e8}y6FUUrzU}E# zM3h=36ZWbOh=Kk+pMLFgZ!GU@x|DjP-Jw>wKJLHz^$)(|Q*Wr*~E^b7yWpZJ5H zd~w(NZF{;Rh;T{OjSxr>5cjPCqIO3lsSH3wEP~;XiNm}k#cW!|T+}0TAAyLcwO9}H za1CL?ie^!lx~}!@-+lb+U;gUf{_<~rh#3gLO>WM5c-o0HocZ`>h=klnw$^k%IY4%epVyA>&AOr@}-~n7e4vJKU!aV>vZ=zAUlJG-@WU$@-SQ0!i=Wj0K+^YN|jRB&0(q6p%2$)7Og8X zuu!`yalCrkh^TiHVQ*GyAx5e4@M=GwmZxiXhf=vNyj^!bFLfbp=7{ULUTs&0Zqc50 zD!{_udUZSP1DUwcz7IeidxwCf3JdqWBhUx$KQZF{3qgolB>)p=Ih8ObVq~WP7{gqh znV4|9HV^PVh=_%g#FyKEWm)nXK3WHWeQ!%$jwTk)8-x^!0i607gsP=!lQ@f(@)AnK zEJa2eDI5~wvSxp3AfhlEhWF9C9%BuOh;~g=t}umgNfyn_ctELznIo5y3n9UFYa*;e zYh56alFl3uZe=Oyz&T(k7#`_200<@?eblw~u4W*G^BP`jNeKGsRFII6)9v7zI7>pCnhFpd(S5e08)eqd)E@6n*DNyh=qv=g93RD2BW8&7eplQ{O+E$ zwulq}j1(A1ypG?h$PB4U_KQW41#fP}0>Of+L_gJouI@n|##gn;k7^zg9}@ zkRx(JDKODt00`N5=u@8uP6yuni7-R7h+sBNM+Y-Az2e}IjbP7%d&UniH7i5}uq2IU zay2bm`4;(zUB=uf{fsbw#5BDe^))b=QSh9L$m=a3nmgf~hiQuPk-37%Z3a%z=6oII zp#btQDme3Xlizd<@pFz(ZJs`A(1&Rv%6b1d)E-}d%=a;G#`)6EgG4GlKA(9!e-=xVj1Rr+n3V{*#mVdrsf`&4FgT3&=~4&g$0P+gGHoNB4nn%b$27?(XB2E z0_(f7;0`mI0lhrfWxrQ$cg{yXp~xPNi+Zs{tMf@TpuO+lj# zq%1E?sgJbvf9a2Z&u8Ae``R}jKmM^7KlDAHdhJ|>j>m^rGvJ2Yo08BNR+yO3hXX(< z)S3ra???otF1;&p5eYXV#?~|jAO#Zj7IiJ9_}GmqkER4r1osx_QzgXB;w!)T?$7-E zZ~yEseC=!RUm@V`ROegNA}x#v;Q%8-&E6va@jL&%1#Y|T0c9<=TVX6!wp-_gSZMFo zhljyyFBU|4cpO2rZMyGzx)cn5abL{+X}8OZ+BORt%fd^Qhlj1M1rRJ;cMtdVybM(g z;6ht>2Ox9-(qVTm&ySDSuD+b=cI{)REM+u5-LLJ|L}*=#su2(qUe4>Xa@+NK9kr4T zTMB&sM}Kg6^Aj&V_t`hT>-XJ%{1eCvEvp3ri8s?2j*3cS-=q-L%bVZ-!*Bk<@Bj6` z^EbZySN_^<+iR(&-iKc9*U_|8A_7@t3>z9EygluVw4Qi$?bqE+A3xZ}7<^hri_58C zV30G%!&7_hJ3jY^|J=Xv`WOBXoLB85NC>^0mT|{)1Rt@KlAVZCH;^7 z;@!*hPy8?c*Yf(C)>ZCbUM_FE{od2*a*?I>Z3G%IjZL}6{cFps_phbig~h9PwwJHf zH{LphdA|-qCdS9dem>)OEck1C0FbI7%@WF7f+shl@8cO&ks=lm5riLoE@qw@HZ%98 znWroy$9g=7SjR|$n`<^?O_F0k5K`nKWyCwLZuf89yMqV@&^B5h1`emYCCuAqvec)i zO@W@S%^m8(ty}9B0DTO1D3uN!G!XQBDiO9fRg2NbdX{~+n~l1ZF*FQHAq?Mc-2iUa z#=>yKD@O7h|5v~f(Uyb5wM<$YxG^0bAf=Nk@w@? zyD1aVx-OR&=k3Jb3-3Jqa+QFt&Z(q z>y8M7sKe?~G0@GjZn+Q4DwSNcN)cDH@YA^_c|8r&YM%5wB-*!D7XiSw4XV^y*X;cj zcGEEw35Rw!6`?WQZ8G(137{lAGpU!JojGv?i+n}X~h`R^E1Z8 zWQ|NaAh=WV_|vWfHkme~r|fN`=fna>ZvYadXQ2~wIntN=bQUdb4PrCNab2sw47PW(l3hXPEA; zwCS4-3tePsTN^fX^gJ@1E@$f=7^lM5$7WjBWu~S0<#s z_ifYk(jmZlUdI?cJFXl{5h>jE!NQQACBRYynQe^qTxWlb03@6^0H^N7#1sHhg_v45 z5<&DI{^BQp=9hlQ-Sc9tW=ym$4fG7>>|K2Hrsgr$}z<6rp32M}>%w$* zTIMU3%Q!+z8IVYa@vtu}@MCYt=X`GlHw+DYdbO{G@9%^eq)@44jM%QN6iLaS!e755 zsl2Ijt?8f;3PCDo!T=E-<^jP1FYgxsTnn{bq44Q)et7@s{>8df564Xh0A_&OfUmc` zuB9TkZtXfwcXg=*9;E=C1xec8gqe_*0(oVug|h5I)gEr+M}G2Oed~|@Ngt2inwy3V z>;oYXc6hvkT|>KE-jwrs->&ZNx5iSw_>+I?_Vns2|MA}j_Y_eea?8xif>LPTS|4yZ zNnPt`rmc;L^ZniB{>5vb{d9fn6R-ciKk)SS+rRKv{-bIpjC>&}lf3z90|nua zefQ_F6v#@Qa6}oySr7wQpsrGws}PFZdSIxCoK98EOQn4W!uXCmE)M|^Qdm_XpcGDk z9RQ>x=`o>Z8TL9Z!30MQBz{<52dU7c-awoTa+4}YpFmQm5g>>OFeAub*V6X=p_yTD zVfEPe)`o%~ck}=*<>9(JGD0d8h=Sh2=M9V^e5nN^3d5U(LgB!*HScw zLfkf8O<1t^(fhR6=0(ySxa4x&YAvldDJ%tQ6$?ABwJcd^hPj9UCUXbE*^E zR*Epw*g7#|vP}qy(LB48S#nljjF>YS3-i#daH{Kq0EE;=i!76i*-9iLWhtYLWz8@Z zBH>XIL}^(mGu`2RsJk&!O#cQ0A~H(h>~h(*orp+?h;G-Ll&Y#CoW@*WuXRQAK!|DD zL8Rj0TqHa&a9t}P?$_M|AVMTbvNV0I0LjcgpHHf)isr^lV>lkve_~cMRYkzM6didm z0P-kBR5ij0QL5;etw}}7`Mf$`bz7GuaE{I_FKLN~?&xIHPD3$(+V>s~hL(|AT1&=uy2s!@uxt(Qf5Q^e=vAgDJr1qUH6wWR8= zZaTEqBDIWeZjk-wxwamCET`JGQI>+_c}jD)ws~0uh)lyH)>RlOvItPK1;$(J-}%PIlcC=m!(#>C{+N^ zhL)we#puE5&mL+95EwxFW{orztYCIT9}0jv9BiEK*3r#0NC*(hQpRvIplmyjJeNnf zGEv*wXbs#|Z9T8O=d8wKAIyBdEa9>B_{y)p`wzeR&OiLMZ+!I|AH4VKCW0b-e>pv4 zutH~*iDz?yy6bp}@qPFB{Y!itM{|D~&>hzkmEmRK4<6h7sh%p^ZGh0_vOGR)%iZ$u zs-4$ze_u@fycRRl;audl8DpHz5(Z=R%cWj#9Rgn5)d+fgxQTG@+V}l(S+r-DBAm}f zHJ%>F<-UxYnqn!m@4Yv@f9>3dJwEKqT3ykB+S9(C1c~-t%Yvpcx-v(pqTLA)!e4#; zw=SRg4ZXcOzxC-bKpSgxl?ArUTf9EvwMEzV@ll-roM5c596Ghe*E_ud8Cm;d@-`St(m%XjO-5~KTV zyM5{h|Ja+K{WLD;?Yf=sRw^Z|KmP7J=kNTIJNod;o1b)~y(w;Rz6g43Py1_coZ8c{ zCt#wd4>sheC;ryAws>*!hwa6i%fq|dFh|1Mre{ZX(4d6A!Er?;B2_bWWDN5pg%Lx3 ztdNK)(pfS0s2*z1Ja2S&^%kGxO(;TPLR*L~P41pfE(RwgABB^?K)LMr6 z^*W@GH@$62!liPp+?u!BAR=|^&6cHJ)=CkkzFbbackNwj-8WUY^Lg2twXVx5#L#bc z>k5EszW0gRkcInhYRZMuMc=zEYYA}GP*W+iUB`?2MG8H>e>>lwS$N-?J8aj+OsX0I zQrOhm-b)oGG6xcJn*i^&cP1*8O2!u>b>Y801 zHe5siVKfyXVRD0yTwNU*+TQaHR!a#0Ra@5D_THPV=aOdML}=Hg^ftPWWvST$jnV$R#7!GONBTM%6)I8rif0&q{Hh;TI)}@ZK)Lz z8EKg2=OVkMRc$k`MY2dIOK&Ef-JA)Rwb+QPa{(kBW?*qBm&abnt;4?cTKRNZMppnd z3nWOiPAQCt+pTeBi2pxVe;y-Snx6N8@AiG?L}cd8duv~NVQ-T6i}p? zd!}^X44XxS0Q)*J!8$Ex9@M+dyAt8++TEOmOtWZ%q|(8L28H~+v;`Jz?Lkh#%q*`J zQbmU*p)@RNDdwJm#H!BB#EbyK92ldkJ1|o!Jx-^VB4HBx0w7eSuxhX{0w8BVZ<0d?NFMtGm{~EX16f6ERkZPqS;AapVcxXv!98PFw2`%OA^sgqm9^O zNEi{V_uP=AFouZS0RcVP{{X@S5TMJ#PD z-p4-J06>V;)aB$~O;06$-1I!Da?gGxR}rV*1vm1XG>~9!Z6a~ECxfv=Nfx+9@2@xTHa^1N*-}N>ujfvr|Hchn@ zi7kE)h!FutH)2TSMV%xfS{nqIK(V&;%z`L|Ehi$oiUc|o8Dj(!qu^BhCti8(x4w1H zJRtEt;fNH%zxAyTe&6?f5`|HyP{HnNYxh39KTXr^+m|G4BkDW@nz~aW_T9FNmu$<& za0tuLyI>J@2v-)Ub?R+MDHVg6$MDSP-4;cH6AJ(w5AFK8`|wgY+@?u@*<#D90P?w( zbsew1@!@ZN?X6$?`rBW5>(Rr-JiLmWoz0XVf>Sm}xG|Aqc%UPg>N(;|JN#UM&s=aE z`}G`S~AO9^EGb_py8WsgM284}STrUjTQf?5*IVP>)`tyv|#n94nX95n&L z7<#f^Q$a)kp%YmJ z5t_QD#`GjyMh4K}LY7)p2mp|RQ(-s9TCc7b0zBK-vw12U2GE8*e6$iot$28F1cYf4 zW<&}HIJA)+xD79rQNR>TEnj;M?E!%V+u{gF=ERhg#x{(A+OTk-T8?Ws5ADjcl&K^) zBWJofcj-g3tS4rO42HuxNrtKd=;KQ5y8YfQ|74Pi7!67W$-gIrZXV`m`Elerq((k=7dkj z4Mdf8yJ8mRT16tf)N(ww3}d1~Oau;6D8=+yByF#iH%>7NhXv>Hle9o10E)=Go7O{T zp$Za#W0&!U}6^CgOQk7ikRCx*U?pkXg?tnwn0puggwjw zA*QX9fMnuYMZpn?q(sCDoe<4T3MVqKwVvIA6iK-(AdYSuy{91r@g@v7ZoK2TF^ec^`yQL_;YK&JNw6MQ z=qKIHiGP6Gkv|pbNa-<(*rfSz+8W6=sNat7- ztY%|u!Bt7ZR!=xgW5Gm#(~3Uy@yA5u1A0STOT~SI@DTP8?}@&u?<+4F}iB+ zWvaXV)D|jJVIn|pt>@WGBBq`TvA*_juTwFNaHT-5bzOT~yA(-vnhph|j4Wh{(M+gK|jR$uhHLfDewJ?DoLD&}K zhlWDv;Tm8NLmk{M2|js?UqpL(N777><`Kv=x&w@hv)P*I(Ea&*c|K{=)#BpLe7x$V z2$+u5YAyXZEMk9Nm+Ky9GEdTuodD`2%h9HpbU1|XcO?v#Wt?5qN7rp#$266zhf67R zem*V7q3XoU6w_3$A1yM`ROqTVM0B8K^#o?QMel}=yIWIRRTvAi4QC=QsKeVa(<&T6 z#-Z7&hY#BEy?5uQUi9wZQ1|B_|Gpo(`o?RekO~UQ{YS^&`cMC(pLzLH3>abFEr#r# zcy_F#$g~{$_x<3Hf6qVh&-M@BjIl&m2(}MDh%ja*mfqT5`4|5APksKgpZk-4YWM83 z8GTKT{cxD~XJZ%#XcS*Nnacjwr+?q?|H?1^w{1Bdua-KqHoyCoZ`@VbpG{`4cAxh( z3?97oPP7s3)_dKb%h~zy?!EnfzP{?0wsoR~40GFlD zJJB|FQ)y-l3=nrN_H*UKRqJLRA%L~=JWE^5F-9{8ER~m|_Tl@9bZyft%VFS-Qis}y zqoFX8@Nwx~GbW6W%g74J9ecA<;<)IbOfjRwah-Q%IS%&-hxAaoZZ6f{hl2q^j3}i5 z;d)#}1Od09DZ*$YB^ldDxNuJS|Q z+ORZ4x+SR@RMRbIoax{ZT-Z-U`DrfevE|gZR5A5bS_gP7VrJ{wOq~ekUFpr*GU_C5 zMo4v6bhXu*FaktxT4n(Z9VP`a?=o&kSoTw2wN!SG-Ubnr!e(LUNi22sX)1`)4xI=` zvy=(Bxtg2BRFQ~M)tx;_TN(h;T>7eIDpIibVP=`=W1I7Ya_ub44lu^>Kp|0eBvRG= zZcf8)TSi0x0|2NR3k7%t^wmmXx3J-5W;Ym3r%4KvG1GpIz`l-BH}ZXw+9P19)id%G zAOd>R-EKmJ%6skOM7Y0k@VWM(r_0zmuP(^G*6;n>!W2s%dZF-1us#6(luy6#7ZfECt*Nz)a{McfKx765S9=^$w6ueF) zY)fJ)BBPJdH6loI)E#;L0AL>@E4CscMG(;=(qF`aIvg2O+Io@}le?Q*YD+ewydyE5 z=$vQ@qbnjZ^XS9I)-Tzx40||%Jv4C`IVNqw@-;~&q(RgIa=ozS;=M&_C2I64dc)VZ8=|89;a zRZLn1An!h$5_|_lcjrwg^f6KBS12I@_UlDeDWPdE>9p%pwG=!d$S7& zq{oZaZIFMee! zfn%x@xcA=8tkx=(%wb(yDU}H3UCqN-rUD+Snrw=6!4MHoXdZo4V$Q;Yg#kQodvy|3 z8)MTxa*+s^BBhFlGhu{fp2OLMKmNJrzx3wUEP?=$I9bbYKU`jW@Ba6G>P59YMS~ct z6z!v}!`w^3(PFqFMD9IAN}UQ3L^>-r;SHp`F#=gq{z`;Ij7ZQ|1;Dyz79MT%Ve7I` zq3eeY5o-~VJp`dS64X*K@M^VR{_@+u`qj67{nZcNf3!NlT+41ZZ|YA#H|JcvQO-*O zk}Dj5W|tJ7x|C0ly|^bojAE|gjzk3W#G`9Q5lw=-%bj}!0T4nF_YlGTp3y;r);376 z2$hOH6EKZob*}5$3uAX+t@&7cab^J`!9}N(~@nnD+IxFaDbTYybT7Km232KmJ{#9k6*N zo-fXHSqOQ@^Lkjm@biCje&Xrx`!jzoa0Mx6&pcJm_ux@?(w1v#M>x9;fQseQfAEjJ z{6jx*{lNzhKe*ejAKv}eYu9(*eem{&!-5f~S%|O*uMZzYZ%CQ>wZDA!>E%1G3&A{d zow%<`jD5stqt1m0ryWnbI(l0gUbn-((%E?l0bvTFN#UsqZ&}VHx2Ykz!_9DuP!p`? zrzA^eJOL2kBbg_sOX6m4%9(norNsy$N-g1DYGEcD7ANXx&O}An0lLOi2zkpQ!0kdA zQrRt-eBR5l_I*7=g#E6Fkg)7$DV0aJcCf;9d23>DE;7&B4BF}rL4b_7n@cTJxQ?*C zdT+`l8NnC<$kf}g2up`62@(YakqjNglsf7ClNVzd>LycFh}LZ*k}$e~VeUO}nh^kX z=yX2!b;LF}v=px7UY8|{17~3ZN)|($QYVQ70P0-Q&X|btypKr9iv@Y;&7g+}ixg#J zMjcj2azwom2$)#d!)uXsX(Ceg;^u~!KoS>j_Q{Ap!wGW<*5ZnB5HW=0reQ&Ui3lEi&!O=$cyXwvJMy zPU5~INe69aevOJZTBDqQ7oeI%CN1`$njA=)A)RYxg>cIX~sXdtvc z5HL}mt&IT442=j-wbZ4sP=4;15NkmsK&V9`3)V;pR+Cax2N4H25cWRmRGDJ)l_I&h zRB?C4*!($!VcV227ZHd!&vgS##z|5Sz)TRxM946Prvo*U(TYg2cMiw3meST*EB8g4Kfdr9Smk24G^T9E+h!A7yU|A?-NTo_dzII5p1`(!8f|<4{GHwe5 ze+)(gW&#d?Z5o|4q)q7VX?IShP2e_GMuaULqErbpX3i5JQ~gdL763w3t+ggeled6T zOUE!kWUHSgE;Agj+r9T5fM6dTDb6nH`4ju)Y5|9{z5L|w|I{Zx_taN^=dIUXy_=XF zI#HPNa0PBYt6axH_-Ozin-(tNm_*6O4U32^M>#zONuSS)coxl=GuqSC98Y_IO|^n~ zOb`(aV*||v00a`5J8#;pjn0{d){k;BKVo{_L@{s!*Gb6`BGO5UzjZa3C3N;|m@f%W zre}gUITN;98$E6V01y+sgQu?q+`O=YhJQ@%TF50)(Eml1gH%pa*GW5CB*yJ z?fN)wm8sNfYHb<2UBQUu*h)><5n|xggRA|#n|IT?v~ImjV#D2x2zs;R01!d%8jy%U zAOu(Q2o`F+L&R=BBS7*8`#Ri0n2B+84FHy6LnBNI_tm0qg92jGVWqNL?yz7CE0s;n z4Ovho(G0ao>EKA_tErj92HFb)cNfOq#t(e*$oS|c-}>FRKmT1X z0)nd%qnk@1h;W2;9op^k&N(xTRn>!qiLp0L`gu7blfr>%%?*_8_||#Mrxr#;#JGq%ArCW(0Rw7n^pa zHx0$zo(lm z_u#z;um8#~zVbi&GuKyrQ5C6l`-MAqUcB=PGPC#AuReJ5x4!s|zxhk=z54o{TkPEl z`FQvK^1(fN@_ARqeZ748+1J~cYn4KW>*f5c65@K*_80S`N9*C(_q*cO=Ux5a;o=m` z(pII3rSS34ODWII^u=pa;v$?pL8hdAd!|{LTJSc4at|L0CpbYS4GBSx%1n(A)jftW zQ(n#841%)ju2TsQ9g0LYG$N#Oju;WKk8xPXMXjm^M$8m|=Ac8}W10#yXlfQ<5TstF zf?;k3Ftt?)e7`U2Vi>_it{<)mFbMad?iy!jvum{Lb$3x*u?hxK8=7E5fY5{B7|h-$=1wzh!D!I zj@1G@%f$RT;bi+-;gC9bTuJUV_$CgxlI!xHmcYqc!*Qw@5IQ_(w|(u1q&i%KCLVp1DrR9z zo93E~e>kE4Ol^NQw{=t`BG9419H9UxNNsH_B0_GNTp_A9y4I;cz%*4IY97ndiD>ke z+IK?gZ4};6OR}W}j~p|FLt8ZiB{DBIJhZC_dywmBYpYXT*9I9N)y*A6kdVv*2vU@i zGp}hXNTAI}7!kGJ89DER$*4(VbX!NV`%;t@=F8Gb5my_1+19wD1yvo_w30sT8S!8HNO9qSi;9dy*Ufe1_@drNj;>YiN{mbvZ_r^m8Mo7kyrnyzsMQB_6BIL3JldFS(n+Yc(Hoq+1 zgo{yvf|5^@P5QPsM)!}Z-*03#W|ouB%ofO!cv}QnY}Io3rV=`dT>OOL&v_=~K>X(W za$k|7?5ukLbFGm+rL57nDBsBRfQZv(z#|B5N`KrI9kz8ZexuDf^#i{7qXAEOz_AJM zw;X_N9k8`QTjR39j2^cX__%`K+MQD^e`+%RCuzQ?PV3ZJ;OT$cz(1?OtRNd&`_ z%IJ7pOcUja;M*w+5ow$+RRAE|Yms$b-??}E^z%<$tp_8kSV3fqgGJ`L@E^k z!QH31x*CzFnhlrAh# zxfjBeoK3ZS;nll;&xa45yxa!@GYt<2oaYG%dRO5x)GX6xkWwP7V?dTG0V2XeZEay2 z8rf7q(AEG%7R+@aPxRo!tK-!Hz%QS;6Ha4U5jDu?{XEU(;bHs_U;NHr`>k(%>Gk{f z4xNRo$oWJNk&CbZ&$><3N@WO4fi)Fg+qkUwRP~R|@kGQ^6Zz6%4JXooVLr$%&n5_0 zq~3HslOp7TROtFRVi*^iW`S@3Bt|p1ezcVHG7%>YeP%%&fj-|V(|Nt~!jqRTy!7-d zpLz7=n_vEgzf~FLT_MC$xK>7V=a9;0=hOAoLd=19{b)6J1aidQwd^D?ygMOWoD~uB zX8XB#0D2IjOq3ihB7y)ZIM1aw9nI%msdH(|NH0g3%GLXC#aM1W9{c_7{9-q*uRW|C z`?9uYKKJtO@-|=~i%=Q&AAIdse|>+k10+JPwLJUuIre75fF*`eDR*9a;lbCxX0~ku zUE}!RL$EHwfKhK>-hSc5_ujqBNOR@i`K$lc<%`cg{{uhj^Q;K%xN2nFi-5;``P66r z=+A!a`+n#b|KeY`_w}#enkK2TTwS#XcQ2oRVFd=HJ1@RK^AtjXz_l*RU;?Vbf=EC` zmZqb1DZzrfv&t3Q^(YmrQqKOCvz(519g{E4& z+R_byrrD;#9>xLDv^yTJTPf^Ak!YFo zQ_<0KC8%b|G`f;-P9Fns={n4)kea($DZ)d0PlgGBZ{f=GJZ&m`_gYKN5wSu5_pH)H zPE$%u)^)DrO65d1)>_*-vMv#>Ir-7dK`)&1!o0C1+mwigDmVZ_rv4GqJTr^rj(=oO znCWgmX9nmr7gKYyoJ1nRP(#9XX?3dU0I5@9rXq}p>)OT`tu+w_j|BA~F)^Ad5+IVA zmm+3bizq;A4H1diT#JaRArL^`dKDsi>!lQ81Vk1h=5_6iG}KtQcZ~=$Eh0=*Y8mSw zuG-bjrm0G0!j73B0J$eY5f&lLG=Oj_Y--b7AVP;qkvKt^J%E=0r<%;N5~mSyP?@i+z;Vwy^p7ilOgwRjS* zHWUryU^zwV(^ONA+xu{H^GF>(5h1xq0zhL7tw}Rwa#dnhQzG(VEbQsEL@1eS%RDl3 z9D$e;{*fQa1kjlorgAc<6!r*EaP+mcT9P_NHin4g?kYnA-A)-y+rXHaf|wIzk^K@e zWs(mfu1l-6u4}ugrBb_pnrmVyqGLn~W+0GG((Aysj+}3jun%XJ2=jZ5gj7T(o-QW6 zau3gs_PoQgr)e%%4_sZ>>%QAhFMa&>)6ZVK`qlT}cuGe(1|yGiE^y;9Zxc4r z4dxw?a+j8-2KgV2`?L1{=pRo#z)fkMPt;F5(VKrg{n$-8zl{@a(!NeV`q;H_YL-sA zqtmbWsFy(1a+jZL;&gu#fsW1Z92-j&hsHPFefU$~6RrUe%oqU>P?+mfdRK3OfGqsz z(XrI)TbCDYX*!}zGKRKQiAV&vNLxA*yPA~T_j#GB4oC1hmDc(?Y}!{>XzM_XQe<5R zpi7m}x&h4d1b|zIrR8p2hnC8%k6cOhrrFE3))U4rm33r*IrVic#{~i0U5A&# zEEF21PKaaeKm4gDfAm{-e(5XsE^eKZgPRla2M?Fm-nje3<;xJk$g-aTV01+X5k?9d z-kU|(`T1D{jpn8B=)=sW-E0<#Naw=6D>Ke>aj@Qfo=Ui`ecb=>z!(5l=P5#3Q}69; zKM~d7>8-oRzxk!F|H2nvd-dH%-E695o(fCGY(N0&P^rR5+6@SiP}74S5yNiJ^6?2i zJKJ+)6Zz=ohh8dmb0N5OCifq%I-)m02pcMeThlNol>@_u?`}=1>gpMlupSyzA5D#H zbek{E&u*WO2M-Y72mkb+dFp$Akcv8(q^dK|m6LQGfJ-q(?o zy>L)BWkSHhH0|rvqjtRZQec|P*;%#WrUMI&r6XtQHe+BZJUaA6DPrE2bsg)mBcTne zg>$EL{pctp2z>SK-S+4a?Qcamh7tHWhFhO+on79#efwjd{M1kV0jxV~W4Eis@=O2b zzjgh_2bX6vGWMhK8LK)30*I|0)TVQ~c;czlMw8G`mpZ-kt+$pB@71TCZR;}4^OK+a z^sB%08y8bMJDacWJ^F9|rGNE%e&$C%_WeJ0`SDMlo!{cKy&D=zYrU&2S8ad$iJ$t@ z|KNY~=l^_P77kg~_4@sHZol&V*3F8ZJ@Hi8&w-)CT|0W5otL(ld6X*Xu^js4Q)dr8 zT+VOpt{z^;zV7#B8E!*mH?`F+0?xUt7HPC)rpKX=5Q+IuEPX^)z@cMEDW=Ya+(N^O zPyo0`<}?MknInns|8gZ5FR{S0$Dw-9~={{V*5mbh{b;#!=gd9UWk8__ zAOK;c!t3I#YdC@_AzeRO=6UL_?T{2a9IGO+Q%IF{9m_fhQ6^rFt<);%WM$3^DKWLB zOD(D8$goc-tV6vean&(kn(Jsv!lRG2w0TzpVz_7FF#0I9P*~7!D93wD}+- zY?!$LVDG(_($)b8(^Mjp+7oarLX0D`7tBN`xb{A3!BRNyGNyrK5#a{OP&Y*P0QLQT z)@}$`tEgIT6eA#C^=LZn3KK4eUTQfUmRtKZqieTse`H5FR;M9|IAA znffwH5eRp+K%b^U!Vb~bo<;f?iiRTGmd;GmB&z00rIyyZ`Zf%zQ_#=bqRg1uB;w|k=!K2i==$ZpsN)iTbB$HgSxtpqIpj_{obg48-Cb_?@Bgv03oCwWL)zo~d zk_-SYQYs|vO4UjcL?EgG(VO=^626&oGVPig_tACURkN7qnwfVvRgr0oQA){efN214?&n11oTm73BKA;T0K>OUj;WT7&Q!7v zPB%{e6mdd7KjMqsmV}srSzE%uX^)XU0o}dI29;rX_&*o61AHB?)lakCJJZTLH#(-9XN{*h{;8AlwS+6ULi-li(uECNT@TDLg_69pg%Fw;=Ky1trr zbDeiO1`;q!dQ)->Bc-?-NdW*Rgi=^YM>cSHL!u>0RzOFGT7^r2h}Fy^u#*T?mexBl zjXv@%nWiE_$go}XD<(R8v;h%i5*>;tCnXsk*JElK5dn&fHUfFu#7%<8v-qF>{hxmK z;g?^1_xj@O3=!AfKK1O`(@$O=4htm-zDVMUiE#AJh1;<^csA2@CPoP`W=3Kuf`t)L zb)>Aw!#})xp9&riYahB?FK#~7>CRKP!aS_CTXV5wY$b~`r5K1>8jXqrXa z$T!Q8&9GOTd z<9N{H)$a06#w(V~%b)(o|H-M!bo;WN-KKdL%I(nQs{7X)voUEUU(VS76DIx;*&9z5M+kSi+cY`zw$SJ zAA&TszKRB9=Bd~grk zNmv8UpMPn0>-^rU-wBb6r=CFV+D9#w3lCKysJrR7wB1>G>WQ6@wH~S_9@E7nRgMq) zotdAQ@b2+ue2`g>v5oNYX8#E}SHn{lDF|)aR)mE90Hi=}Gt3196S0t*(zaXJCPu_a zgeaUayD^M~1^Cd$Fi&lzM`Ru*Ahq5v_d6tDWD*_@?bwDHGuF9~@YS-e8a6r*27-Ak z%?NS7uNify0M=t(tT5~^N;7=)a5+DpAqF#xSW|C9$w4Yfkv;|$mP$mtEN$LTZ5^P| zdfQSFrZW1dQ^w;`orE}u+0;gNVhV8LnqrJJ^N~S!wPdN0;1W0?%u|hE9;5X!G^zX) zgqY8YNiZBt&CC;&IffD9ysLn)YTssu5z}0yvJPdDtUK4W6JVW+FlR|Oh6XDj*tSE? z0dtPoFkeOQI!$GoMJ?7gunkWzKsvR6N@a*@?yZd~Ww)Cw+?X;mHMc;B5D0{v^04LD zrn%;?+&Z=6Q-R5i$0F@Ni+N6_ew+O-2b-4FWZS5Tq~wj6PB% zoEH;SixcJrVDo?iMD|wzG5Sa(5d`=qvmpQ!P9JQf88-#JSx{w(2|%Xi;iujMH_?9} zF_07;0|oM`l}dL`bwCva3~(079*h{XmNmC+QG$_?Q6jQw&CQ6=vh8O)X^ml{U!iB| zS*oxBJfEi@{;7|B>hn*3`HOG8{_Xo$_gCJmJCs5i$l@@z76ngC znWXIG@xK|F=jQ?d0~}8!Y)Cb79PtOeUwt$GFYe-xq5W{ z@csjYBoQfbL_}Xlexb!&;H@h-#M4#)zK{u z$7A7ge(QXyg@prYbeAH?kW$xD3L=l@RHPrfFWpU-Wxap@fsUcWOh;}Bduz2+8#Z!I^$c11qjwvkAwqJht0E8;ln}E6{{?d+FS&}*L5^E3JB-n7SN1{S5M6&L(xNyK}w&`tASzue|q-cYfvH`ZxAZ+8zKl#N z4Zw%*KRUeoUb%A#;dW^A`6ZR&!!}!0pdI_ecRslN*@B2Z#;vEHozKsYhlA`US2uMh z#(?$1tHYZgzW>!%O=Exg-+t`-zyAmSzCTkhpI(;kb)GLS+oA8ujvU|my{~`jj~uD) z`_gw8cfR`%{LDAY-+u0gf8wPd`q6Ly_5bSC|L(8fxhSf(EK27b0mp0IouQ9$eo@!= z52$c{R$Di4JwGdl;kOapFkzHt4&Vse7MPj6^*)RVZTs|zsxbo*`AKzZY5|~{@svq- zp%kN=MOOI;fTwKEEN~FP&CHCM!JUxTrk=!@zV3Dv5t+FUSG6jGWWG8q!#$vT;O?UK z;o4M%kB9DN`?G0X)d_mHF~&TX;%?!G!)V=#;217xIEW~v^sWwM$01d0T@jEguWc|J zA-7c{qK%;nkFJh{q~N3bv=bt5wcfo}6eb;(d~TqG9QcWy--<9HjBX=83`7jyhH#8|+?W~7JXZ?1rDjrFHFLz01fs(ZSIgP?E+R%ZDhLo+ z_3qCm9d09P5kLr!zIGz4Rdi@rFi~c(1VSy6(d>*Qh1=3SLNZ%@Dn5K1RVpFVa_prd zB3QSuU=fYZOz5yIi-+%allJH>%X-XU#7W3h`|vUe0+_m*32{L&byt^}&Ej}$yrsGh z9bPMYxOFR)M_1PlQF+V<~Nb6&as8s-BsHti|tZQSWIv4F`%}W(Xv~Jrh0Dk4VUa$Ivz!orsCk?>I4@QbJ72qD~T`*V0e+BXAF zE5{U*xQD4D7($dHqid3~OqEV~3q;&AdjzoeG0l^y=7lTFrDkL&5@%#y=8BA zLjt00!NSa@8jzEw(6Ny{bB>&D<8^J!m`^X2JZ=H7b;yL6kDLvKJ8ZVvcpP{f5vedg z9S{JB+E86vlh0q-8Je)Zt`xfgGl!T$V=3ocjd)q`WIT!d(Ms~#Vk+_N{Ac zY=G_9&d=*l{-IBQ`g^Xw{9A9m@!I|6(O}rN0iF~6)APAe{=lX{xl#3?dn6S)PB5I5 zh-X3Vrx@l4AmV&!NSJ|WbaDx2VUyGDlMrl+*}^0^nZwO6JF>}&+$Pe5;6ab@2EfV4I(BJcHAcVRNU0h{fE0H>wJ&5z%-6Q_nK9|BKL4nNv1;Nz|Y`WX4`dFp3IdK!9$ zDgtI!hzKuzeDl4l&%FE$ww@HHT)AfVES1};*^#sGvL5c;yL;z}XQth5^yW5L1R$oJ z08*9_dFLZWE+x%s+q8>F7?FU8#sCso*Upk0F(%HaIXLm`kP9;tfaWo9b7Cl!b<^6C zR5E22QO%?RJRXh@9()K9Buoq<7->t75FsfPVI)XY*WO>gv-@BDsUP?oUw93Gf8x7e zc+F@Nxtxm<-y17&9nDJi^?-;+)_@ zd_VKsODqn^$VhF(y7UXisN7ru$Ri3fGYY|6PaJLrAUrO5>zO;3&piRXpY3<$YvS_gy~w!WVw-U%&eHcV=O!;^s(TW@doiYb6sdg+h!A zsoJ={Pm&HOaPxLp>Yk@5aGH+b9!fyH`^SFd$Ii~qf9L1_^TV6(RSBUoh9T*^!|v<2 zdVlxq6S{=ET|WKf#Z$NYdmq*!eeJatsi5r<6-FYnn4f&=>6e~;@U>To>2SS#{*V6Q zmw)CDz4JT2`L)0D*M!Too5s+wjIaI5Z+!Y^{^0GWpJgRt3~f?{ggE5x8*jezTVHtT z_y2*TLSOsGf8S5P_@h4-7f%Z&FIDPXJfaM(!j(O+wneY6Jy3;cx+rCb-8{H1>p+6% z&x%|p`vc>^X0nBXZ zKtN_HlUOqraX$yYMDPxwii8db1A!C?_*NLaOj;@KW&kMGy z)hd7+&^q_&8+fru@_9D>cius0d-F1htW=>5egcyC8pKRL)vnvr5TF#s0JkU;Gjobv zSt!h>U6mr*N1aP=ib%Vih*0-|LZxsZ$Ry^`md--y96LMTF{5@x;w>2_47WVgyjjOd zZ=JXCkV@7`-C1p#3nEAqgmHciFV0brU6 zGKK>nl)@3PE+cmd;UU6Y#KTNYAxsnZj35vYs+K7b071gJCz<9Ns>tMi3Y=ohvo3L; z>pJFLt+kX|v*H)Yfw0L%7&7ZH;dtQN1Ufd6 z$95bLOh+k`Z#;fLA~yq&+}G)_R9P@l-}2*7iliHRlT24J_b}T;)LXjnR^xFl*oWRE zQZuB1cx%0~Te!Kp;s*3f?R(OaDFD=To@bKHTcWN*$9y)mwMTfJWxtyd!`&ittIICX z+Oa+R{Kb>ceCEA(9)0Q8-+cRxhkez|L(Xn6xrN(|AJLNods4C>5r*Lwn)X=bpK~I_ z4S<$(PBqP)4CW~aCtN`ua6;US!gPAQTLv)R;Db&j@M(L5Y3DudBH(6K=&_|SKo<3g z1ekGe%$&tKra=Bg+C0_E8Bn&pd!7Wm%wEVG%zO@hiY+^RH=NY=0-F)xvD#--@0_xM z@kTLp()0stN~asO58UYcA9om!#XoRTFKy7$IH~-%1|vTDEApk}!Xh8}cx96D5gy%SLI}`qEGMo4Q_u8ALICV- z%MuQ82#`uP%vZon5JaezuO1#gc>jam+q|1hJwcXj8Hr?8_3lZ11|3Qy$E)Q|k$>Q) zKLY@5Y3*=~2pdXBC2xcgTq)8v2=M69AVefO9v0sc0UfuYDWp>(0Si)O^kL?umfmz# zy|~ypm0y4L!{2-J_1Eqm9(Cv=N)?iV$+jE5MGFNGqeu4t;i?niE%E13UnqKqVFkZ3 zIv8^)VbK5%K&5G02UWI3IsEKa>5C4*!ek!D>#;v8u5n!Yr#|uW&;B$2n@10>DT0W& zlx+*?s(tNkbPsmbtNUO38~b~y*GaMYfrxX>`(u>KX>`*@432rfA{nYKk|?K-F{T{NmqgFvdFC(VqI` zb7xPzur6cT?fU)qzw>)vDMahBNoDBv%Rl!Y{2gt1@h5+R>e*11TCd-G>(yWVmAAj} z#q+t0Wf0TF`Q#pm)Y}R`ZD?;}+RL(P4|3w`>t=@YOc!nv)FCk4s}TtwwBdnB#HuHl z6{4$`THSnPyiumIlc%YMGTaBjBYGQUD#vh^!glMZ8qhX957nggBSdOF44B^YQO5wih;kpN6JC2;Sw{8xh=DS@b z!0YRVgsrI3nFRubC3AlxLWgEKRf=o`^Z;V) zZ7`7$nQ18k2xA>oIKkd5j1Z%1dX8;uj#wRfG@s`Z?%D?z)@}){&$~dKWJ47dR`tI0 zc{c%IsJjIt5S%;C?#OeqM&t6M4Mzb=BwgCvTX`OkV839bg(IQ-`^rjv* zPqnRsIe}3|XaY&@%8~`!+7NIY*E-kUb)&NncW)_~>5BqvVb#Js&(peg9fM_?*Ggdk z>3twkTUxEP&c)PP8}7jXX6A`Z_sFg+9Qx3Co|fafnII{PEF$JGiwJkHVWqGQL&|)c zO>f+7Akubv6Qykc5Hh+;N*P^=5+fd}PDx;OS52aR5K|8OQ}dI9%d{N6Rvp@v3+vFejZ&BhsixwN0w67g$sB+;D1pdV51JHYT1n-2-H516a`oVNetY)FbOm_sh0CY@#I3i! zbN{z~OUey$F1s(*q-_6D{h_zytxxn`bgt6hfZ$*oXXqmZ!x_A0QsH7 z={Lx)Z;tQ`1hCANM?~28t%yiO+nOXcG;rF_Hhn}YFcBRhJd^ltVh1vicysZd`UHUO ziBVGj5pHt59`h~eu@rx^2W-2M0Ps^^1W5t9so!su`Zp7Oc>K7hZ-JYRgKk7YH*EzX z!Q-97%_HMu<p0cc|+|Az>PI4{tyjz}z6X13w?KYaM% zy?bF!EP#Qy1x#ckPE6!ZClr@dv0>?+ZP(YxoOB4OH61@?DsAm_+8s|*2>@`P=F-;z zyrn4<7i4VOSj5e3IAGL?%|d%nWn!3srdt;eSNl)?hgZM&?T1E^^zKpsB5Zi>$Ph6( zYZm6o8uGXhoH<}=pFG3QO(EgXO$cs7`H&=OQHXK0*bP$#Xu1;=aANO1qr8G`_M#BE zum95DME6peL;_$L?Zxl^+~@!9zyJEdhXuSW?Z5n&{^d7+`_(6(xp?r+@BH$=@vr~U zfBK&}d;XKHE$1(N@^gRu@A|@D{I@F*GliKHu5(dsQaD@_4oXCIF2}p?`B;G>FnC{& zuiyWbfA`;h?<=qM>;AzT-};Gv;-9fP1!@=`uiMk#`~9!{>>vEy|Kz_QCYC@3uEIiN zIZ`1m0vK58i{JbCw}1P0f`FNr(9DPs+zNveV3}?||FO}$cXNwJ@4R{I?%UVz-v9jH z_xIL|`rfOrUfn<3e)gH~{u6%>KlOY#)*z8H~6j(V`$T-WIq$ z(|i5qf)a>;gy12<*nkj0w#iKpX=~xY!pH=XoHq0b5n^IQ076$s-l)l0znUglBGSvn zOd`C|KayuhsOrbAcg|)elvxtndJPOYX08mn+^+9WSr(=0#;fy|`t zA}oc?qE12#({6%D$@KQ0s!wwz#taL}O9Tc?yPC0}Mc9VAqpGEzhdHwWz|wSJ!L;c@ ziO|E=)k-M=nzsT|W1>>Zysw1V`{2~N07#*LfB_M)ERB(Jdw>Oy(gxs!SPEf6-zmmW zVwNJIPKCnV)pz>|5l@=6M319~_pSio;ao(A<|A z%)SM1AEin})Jb#z;0B8Uk%-Q3K4nuUlVGrz$1XOo)k z_j4a3BGzTSI6Dh4HIKTn;f2Z3=c$;u4KG!UVhm-%-ELx$(FX}d3_uhRB5)x@3U?9O zBl>mR;z zR1Fa!B+8?A8nbU)rU;1Gf(tP316xoPo@&<{70rn=hlpDxon=@q1275x+sX>kb&xer z&e`2h30KJ~a3>;0$RoK`^C_%?(}Dsa!v^A%0FXHb|D!q_PPqhI1-~^INEx`a@wq}K|#1AX5N^jA>NC$S z%Mt`B#nEA^gM@nu{1r6Qdmr9EUM){Q_f)ObEcSkcZiu!*AS7^uiNayDE|qdUT58Vk4FTreL?mwB+Isi>yVqAo z07w;STZ|b*a6PJ24)Apy%-Gu?LKbODlPaJwh9O{I2Qikyy$`N}NTX{Y=4_@+WvnCh zNZM6|%q$${-DGMyl!S6PCxvp*0Ip>!I?RVnvoynh{jYxct8XvoXJ<@c=3t4H-5NJ$ z3J7%vaEM^FrzAdhi`%2+xI!P^%*QQheUym={8lKr3I};V{ePs zN>ib$>%kJG%JDER_H|#&_51hM`w!;JbGY|@`|!hi_aDCV_18Z5&YSCc{HZ_t4?pwy z?>Sr_&3roBKlA)^tsO6JpS9lK{?b=J@z&R$d*%E1lb_t(K0CaB1f=D#+k&AKX|{^ zSteOlZQbU%9v&Qb=Mz`HdeAP;ClR^#`kUk7Lp;AQb8XJ^g}^lL_U9M3zWR&5K0o;% z{Lr8N$CgJ|5W%&!#b5fNzvI=v{

l9}uxa*l_D`c;_uZc5~}S$j`m^$YX9W^=^yw>9|IyV+?M6(S6+GMb1z@NbDz}T|I!ye@%Q{W-tTR9>(hV#Klw=; zqxI?h63UDie7yH-|IS~0{cryA?fu-FNfk5)q4V9&OyBz5Z`^zBJK7YGO#R|wXYP*< zBLYa(hRwU$j#@A4;i@sxJeTXMm5X3_0ob3{w%B^;`yyw7W*~y9k#>DmM}#pt01VZV zgu8&zN2&owAMRd?qz3>ZOx+P!@J4YM0mNix0U1dVfxw(x3n)cKA4SL_dK)Yh5#6D8 zcZZ9!8sTy_^@12QAXgRKBs#4h1-GL|4q{j$hpp5}YfG~zf0GgYI6w#sU zu}^bJv2PM=N)-}nYgaXq&P;0?5I{^ZY_uUomSfw^1t7pfB&;KP)e-NBodBFH$@=G`>bLBvQnx&o0}PkF;Ml_JvH7|9uAOqz3^bDIb|YzsjH zM~u zN>NoNMgp@q9@bK2j1ghXVrq3R8C;RMzaqp;y^m}sa*Y$_QpAzl>2~Sn5ow=*EMZaj zM4FG&VjN6Os<>LXqllXmfvRVanR}GNy{mg{+Bx+cCAddIY*Uk*tpXyXufW|)VPYO# zQ|mZ}B61qLTN_e@U~44CusY>B$XF=vyxH|3Qh);Z=z&B?m`eb6OD(Zm^7!*D8(V&` zM|uq0JV|JPIELQHr-=}e%soyy;yRp8Cyc71L5AA72Nx`b?_8em_S5APyZyeNozKjC zcB@W>%A9Z^8*7ii>#N1X(Q!U6eQkXi^S(mUzEYXW=(azXF?>Dfye~}LdK=BcvF=3& zclF-eCqDhe$3Oe@w_m;cg}?Q!>wAkiB=B^D`~U!erh^Moa~n6qqBBARo)+IJMhMZa2mjU zq*chOefxo%HNef^9~bmDkGu6`n*`|bS8g6H|Mlk2`7p=hdU<)4hUTpc+i1HRg92ci zn+}KH{MLs*_UY${7!aj$gj@RmhEBUm#BJ?dcnre;78H@|RpW-gTPMJ@HOeDTdMzje5E>k`~>>nJzrTfWa`mY=*! ziCg3^?BJ=<_RjBv-bXrM1j1^5Hc=`Qo-8r{IA{#~E@@JqkDTrYqqRjSeTyKjLuL;=%se)c2(=>Ou$SAK*T{NV@j@X@@# zh-tSTt_L!}{P{ojcfS4gFF$(y^}@wjpa0Cqo_giGdp{Oon&{EJdjMo^x{N}gYk%jf zUw!5Jy3VuOGTpj(=?8xB)xYxJ?9Uh(nKu$hdOwQr*}lpo(ahV@uRfeFFU>*Cr>CC0 zc=5RpzWGf=ynQkM?tlGPpL+RIFa7vWuZKs(VivoXUVi0g|L7Ng?%$tx72E@1IxqL% zeghmL=QKK|J5PS^AN%9K@t6L;Ncgdz`26So)IadVXTMvouG7cW&E}Ur{YU?~|L1t; zJHPxd|M}~;-p6}sRob=9%11DAf@zWj4{q`O}m*fLMp+oGQd=^&*g9&6UF)YJnh6SkPAmV zS>xLy1-pPqfq{^AF9=B5G!l{94M063M7^#3lxa_6*w(Tl0^%v*E2lUFxs%;4CJul( z8$-e@cM`qV)i@JUyCGrg!*uhBB2&2c;UYZL#UdhtpqrL510gNSfy4~xBBTMh(O@Lp z-JFDgs4Xk9TwSlk2uxjlL?oJU42y_qS1_n|1;A3-Jhm-6z%&;m%-EOI5Vtm%GUW-A zTW2GQep$I%orH*LDFdO@V&=UKmYncIWE3mlw%o5JhdZT+J0!3iPo#N7D1`@tsn7eF zg-oMX1^_}XQgX6bY6*`qOwk~qPBj7$Nea3HQIaar%-sx`Y8AIgfOVbH-x4-J3NK3& z=31GU+!HnuL$wbL2vr1+QYFhrcX0P2C9;+(f&g=^IaKPc=ZrHq+nDU;)-59C7OfA0 z^h8=FK$TJwuL*#ywRBbHWH-;M%zPz6M+Bfc2_f}9@JTC=1Wr{-DI)?AM;|Pl^<3WmEQy(x zis0z?EhoK2QnN%ZGPg$!-tazr#wy#o-FL*ml{(9+P{dd_ttN2_(NXBYdk zi|OpFUfh~@XY-vW&*xcg-P$1rF)oLNXYT6&B-7#1$1o8gVH7GZZ5hN&9nAs5bs#$2 ze&SrsoIDUboPdspwj5g)iaIGx^xl)&L>pM6sUtr*~5*9|09ofQ~Bd5A^1jNbo0HZB>+5r z{Mgb1ZXV?7>iFz4Po%g|@-t89o~#~7SXDq^#3c2LufF&8kAD35^V-(tPAMXSh&ol% zfD%LPa5#$4ZoeBXnL@H2`|+Sgkbx6aP@^L`#(K@`A8a~2%xeI2DT3%8{sZta3EMjx3f8mVQ>bi%F>AXVBrOp%$Suo+BKxq5VU_3+Wv)uHzm5v3G2Phr?-P6AS> zH?^U4VgMY&rLt(mM5c}zB-zq|1Z^2ysCR|HQf0J3%%B@2yA6$iQbdP~kgK_cR6u~y zhEyJHfJ2=`hmCCgVT+Rl045|Z-+BKLvTUb@2QwjnK?FkTTgmML<4N(C_fU`RB5*En zT)Mf>Mb_RU@X%~ms1FB=bD=%jm5C!D@%udvV%FR4d>X5P`8@Mj%>@cU0JhcUGg*#f zH`j4J?!NxotyjL=%h`G~f^zZX#KI3AUcdc~Z-4B^J29&UGd=O#3vU|qZamSv-+%qD z|E=HqrC;$?C*e}3HcSma{LVY=;Um1f<2LZ@;_}YZ#ParU{LSC_PyfT~cOP6l_vDZN zLx1khXJ0uUk8Nq^mzOVn@ArT4YhT~(%V>K0nP*^{_3Fq-5V(Kh$+M^K5aLvCT|WE7 z$1iR@_1W(-7-47@UG(UM>-O34x)t+_^Lf2)wU+C9$A@pf zvw!*1T^kTjwbaXJ+Nv@aBHl^-?SJpzz4PJ=yXQaAkJre&T(y^e;-}yErN43ijkh5z zSjx=reEs!%-}v(7XFq?u|2|`ZrZ4>PkN)f@KBhA5pLl`h{d)IZ2-`jROa#(2M@YYh zVRrfS(+|G<&0qN!|F1R{xLQnOce(c<(|-T$_w{&W$EPmOt`DsnFk=x~yAm@A2Enp) zW~K^((VOLX<*X1?iXz8F0bo9x*JGOt7G_h|t`JanwKY>mB=qJ!{Ard@ccGk|rMTZc zq_7wd7-nX+eF}zpcTaSWnIQri_O3)2Zf2VuDyM4zz=9d>lcpWFC_>1n>Z+$mF+^c* z>c=%_nAV3ogbttfMTfgNKs1vR0@Vu0HTp!H+IMl9=BLKO3nFP$kV~mi>MA*6k z!5H3}l}hWnMr0En=B~r09h)kms0DT>3^gCBG}kdknWU|QSkg4OjV;0faCD0T9@_|6 zRUuFcs~WQ;197)2y>)jJW*ZJnIsYRe9mYhsL10`8oB6s9)0pO>YU|RcodCdS<3!KE z-K`xs5>ur2+N17jTe=h`MqP)gA_5ad7f0q~6rbkwQd{hbF=~lU6l4=@|QJ0K~#JG#ms85JVUP%vDvl)74AH zoV8^D<=7H*cvg+evWjpyo7Sb>Pz4cbT~`~%g+?DltQlF&B6ZtHQK z=i1tU@Of9-Iu6G*vvS=d=}c1<4_uFZngx7gp@>u|;ud2aMI}P^ZqomS1IfoV`#>4+&mv0Mug$+ZV7`z z1kI=crna;?RS3i6>I_TdzdJB9gl7V}s-a_M4w$*y7BrjK${Q;)F{h|S)gU!deWac_ zjriNR^<=R0zOD5UVA@HUXx`O2$;A`#>V=i>u2g1O5?x|5mAQ5*s?H`8NjtO@hJcE7_xd#Ce-T+buR&K02s> zEYUfQ=|4J^KWzs7C%b`<4E0Z4N4_?^`AclX&}}hs$^zTw#~YyZ)PtUcM)_0u^m`v` z8~d{g2N;$u{*zI@WprBmIy%Di_SR485-N7^xzDp?TjfGfPyG20n7UrAv zf{++R2!Ocow5!XZefZ&n!}VcZR>;!doe0&umeO?KMz}&|#KH+9&xUfEO8~6VNyyZ3 zL*mjjPjo^f^f8zv--TKWb9R%+hz=pbfZ&TVQ&GV&~y3JQn9F>)|+#5B5(znMFV?_3rO}@o)Ug z{~x^8i;Ii9UwiGBf9~J>BmeaOxm?^`#6A zb3E;6IZX|L`yT8Myzk^U zzWk*RzxC?XI}guyWuEI>U-(^6Ki^j~?e}QCTB%GTvOC+EI#3{^YY;-6MJ-w%8NC!h z#H2%oxYiBZl8zr6!y}yO!TlpM%`*cAA=fH_DU)>sV4-P}xyGl@WPh;55N~`qh?!-{ zOj0CmcDdME zy*Og(@gM-1kpewpUAh$F!e-knpGDv_HHRFhc>L72jZX%RQ;h^Se zl9s~7M5-jiboj`_0lBC}%p~b#AW9}2fishE0YGBh*BKG3(7LRpR#mG~d+S8x5iHC| zrSQ7+S|z3V0ENqLIj#U`rXms;%&gj3#67k=V@?w)2=ly~TrH>Usi7}bQst7&8vw7h zWD-+r0})e$KJO<4?5*$i^B8Ihxqn`lUQ0$112JV%FKznuKt?8X+eTmrko+7#gvhuq zfPlO;BOx=hpbj_lR9U!3DFi^C^KaXpxnoA=0W+z3L}Ic*M6&vqT6*h%m|3XEr}blm zniEo~g%~3SvqZR=r>Di;iPAqqbt=TvmR71HIVZ1a%mNt$91szy-z!ywd5eb4Ys)Fu zHeb82WNDZx^oS@-0BGiE@j`-3N6jVYru;FNsp?SG%(gNeN{oTPf@kOD?0h~upPzi{ z;^JbrKdZYvO*;XEvJpjzHL(u`mm=$h1QTS5;=3cQtpLmzR5UKf5)z!!VE5 zj0E?SeE$!9*JodO`OP;TeB-yj^WpoCB8x;sX0$YnZUPvD%#Og#5B52(D z@bg-Fqt(f`gb>qamV<}fL*CS}?!I}?{IRIz6dthUUu{M77JC<)(IoZ#fTs|#lVJc5 zDIff%7ubC5d7Zjh4s2<|TfPChZ$Vyo8sx|SBnRN86^KY%?WrF)?I3b#m8Rybxzi9p zr(}S~j|AJQ0&lcUh&K)8X~(b$i1Higrp4LBJzF=FKlbp^_4)a3xFTdk;%OB{6mBAH z?xrrx%=D{Ye(R?`_w)p`9($cQx97d-?ri7kMWl#~VaMw>?TTwyx4J7tgg`8^uKnua z^NGQw4y$wNy(7oy?iTY|Uc$6awGUmFQEQRHqZtIu(^RHuB&H3? z0UkcMdjGw$`wTyv*tH(nP+0)sXv}0SEg~wE6?K;$~iVh=$<1)C) zB*9QB753ciu1gbvI(pRN`BIrH(am=#_hD`Iq(h*wp{yA-ia%eLNd{EZKk70F^l8 z>ft)ieEo1?q7T0QU?| zzq-El!H2)|tzY~1f9}!UWr`s8%ct(#nr5kNYPZfNK$vG%HNx<7CYIhc)XjXkvUwIj zI2=}lV5Di5wv1^mr7$4r;N>v(7ZYKO4(m`P*zfD{IAE9%2F2A?J3pV7L#t;c*4~c3 zKQCP5!TnVVUCi<#@R^T;6ANzJa3V9%p~8%SVa_6>DRUrU(< z0MKC`z(mN{yLttL2*-$!O4=RKE6aN5^KOF3$)-oR4(EwdL2jn~sPjC5L-GljX+5r` zl+1UB04mfLRr5L(A0FUjZl0WVNFZrjMx7T+Yt+sm#t>NgKmWYbm{3-niV|+@`7e7TXjNes;c_r*b^DM4l7D zXl{sSXH}R?X$(a|Vp4VYNU&g?D*%}LvaA48uECjksH=LZ6zX-%`FNWb4$`+lCr+L6gD`%i9*mZ|J_le_m}AgLMC-p$?J zt<+^@5+p$q{|M{=0qi)oV8oy(Gq59Cy(Lm&S8S_DRu!we ztlQty?q;ny#~5FeA7ie4ZrQhhTNmf7z4qE`&o#%_yzldV9B@6xl%vZUnz0e%2oP#M zy6+ewnNRS70yavLg^$q^YHr9W-%-fd34bqnX&_gxwQK$tt7AGgVY zaEmY4X7*?C&#>!mUIp5SGPqfAaU+mg00i>ZpKQ#ZySf^-qVfDPHUl(xd@BWL+n&A{ zo^XluEcNJ<*rm%FK2?Uj2wUY~mJ zgEPI>Mu3Evrv$(r?qP(4j0vS_Myo(L}qvYEOg5eccX@(Y(nV52lt^wl~SshOGqu==I2WIzn>9EhW2M`hgTW`yCnzJb)(eA64nl3Ney1w-A{-e)-@gKhPe}4GJ>#u#!ceWPZ zPal5ytLul)1n}bi<#N=7^xEZRVsbzf=++1K#?5$QGF*-=2}!01Z>oD2a$*x-6}`DG<^Akbq&HiI{6O)bNPaeZ8*t z4)n%BKE4_4?wDbZc?J<<&S_M*DT|wrTuf^rFbuGEExjh@|9 zKw?3U*aEp?{Cl+W7#1QVObSMV5wI?8)TRIcL1qJ{Jq|38#G6b=eH;`>*t;efH}>uA ziiq%``X#eKz@bKvQD;FgqX!1W>9`E0;TWqE6Br>;&NxIJ#6&{O9Igo94n%-~geZxa z$AQG|w%gCg+m+7a?a?wNroqM;Jn3o9t?9b7T(Tr?Yae^a@!2CG zg4uc0hrrB|r4KG7c`hX!mSt_N51~9jFw>^qj)(|JDck@zxIQtB^Pa{Kc1pcl64^xX zLSfqoEtesLCl=yFZXOJ18{kM11EQOE-&(A(oQZ&eA{}GD(f78hW;(L)=G|0lO(_jo zY|4ocHEcNQ03b~%+?S;ew2LJ6h{2E{=JWFmWs6Iau2xD~Yh@-d8wqYKl=48+q*~jU z=+)YYHnh16LTbXCQ-CMotuY|aDb=+xOG*?0DUazp#|ZLMCjw5guARni9I>k%RXxDdeR_=JJ&-`)h+dIq(D zr<26vdT82*J9H$9#>P*_@toQX5zTFUM41V)AY*K$Rg7+AbU5SU-@uV$o56$##MGMt z1dSJLn-*ZS6U2-W?r!Ei40?=%ObT;?{l#?oaQDiq_omDbU%uE~WnQ}c= zO3~KZ8m2_!l7pa>*us}(C4$`{1M=x+X+33@$Bgh3+?tfPjb3mkfpY!8q*{xle^Em+-qyxHJ%fN;qD7xtTFBy1K8TIZ&@cmUF+@bde~20HDxjN(P@o7 zcr?w3*qbs?Q~&0p+wc4I{Qw(>3KF=fbu3eAtEx~g$<2G!Qqn;7GI0ce2EfpVVVR1X zheN+T4yefSbbS8o`81VHFd9&6XF>3glp=5w0#ejv1pw`egiJ_8;ZWu@`kr39sYZY{ z6JfW|YIzbi@rb%K+?ABZ+cn5ML;1iu7#W6=MH08A%OuEXYOA}MxqB(OR%JmV)aJQ} zM~t*iBI;GmToSLR8t#MpDH~<%E)iL*_ncE#*Jg;siJu?+=YI2j%EiOO9fJ@6W5AT* z%53kE27$OMG2JZsK_G)Sk8VMOAg-aXT)NcfI!MVt4K; zeO!>l93E}8-67XS>l!(cRyDKr$&-68e;Pcj8(due@L&J8UV8JpKKR0K{N{iBH^mIm zndmov`ae&*!<#?)+2c*`5XX-nJ%8`*N5A{q>xUn)0~22!4t>>+KL3@+U-&XQ<|(nr zz1>v1H47BVLS_zv%Wbppl==2*VPVeLs#*^KvcSIBunguYFE=$9ub$O;p9$c2z04Qo zv~&QhYd3RbQVkM6UDbI?yUa*XPwGA9odDqTr>EUvCxq7Q^5MKLy@f&qIHW|Fu@OAE zS_1hJSvyGHbgp(D+F{@r-y_k$yx?XC_BKYs;SlKN5wS&fMhs1MIP|VWM2rYDw7kPB zHtYetbwJ1^nR=@Vh!J>m+xGVbA+$MQwBCp2UM-HNE{VWHHKcHBoh7YHpD%Z>-Y=)x zm)bg#tM^q)NdVv)$YiZAr&^{Q9u82e4uZ!p%&B^wMXRbgC$b0+Je}(PVm31X)UNJP zraY+my}P?g;`P+VN@{$-RUO8mWdkN|BsgYoBFW5MBNu^)-g=&rcJI}55fNFJ)l`X* z82joY*=HMMikSK^Rf7XE1ehr;r&W88fRWLr-IxH_E;vz`UPKZ9Ua+ zC{tdSW&s{Px{N_mx=h{D;E!6zPSHjhZH&Ua$1R~RR;hOGPS$RoKyTjb7G6M_ts(>`jsV&{i18})*^FE($j%7Es+6mAt+>I0UW31LM?(f!{RkGwc zN8ofwV6j}+RKz^oAeYou2k^sXnTph<-(J<}kjqT1Vr^!=-d?R`O1;~9>XOUFenzCP ze(}R!__YV>A{OacN-agK6{dnC(XzGK$j{qW! zjBBeOUDy4+eLaRdxLL~C-OYjsf)SC%g1U7bK96aadB+~OE^F`GCiHY%Q%*r13X+lt z`IhW$3>5C#-K-Of>rm;$JQwR`Zo(uS;D`P0=YIX2KX}&f-8;O9Zw82=q60rVDqulCp`lj}!x}NL zfJ~5+xQ`zOhzX4(aZd1n@j~Is0uY_>sUs8=L@7m=24Iw#v!reTKoH@YlZ-ae0NjVN znR<6-*k2SdNQpTGmnoJ?NIa!`pL!LOXz!dTB~m32wum8@N=3l(^`poAbi)rGdcgef z{;S{fnGb&DLjp{R0V0>Y9FM(Mo-bSth%euG3lnjs<@WgO8()6o%}@8v79eH+-GA&S z-u;c=qr^F7n}UgJYwotFfA^pHQ+jpv^s8UWDOsSJo4FZ7M4p(0SO}1o}b!No34v!Xqe%k&(wt ztJOC635hcXY~Tolu7)=9Lj(zOPR+Xo3?-?003iW5YzU62V9IQ20oc^%EGdorS8$B7 zOWpi*YG#&%Yjs2-4mB5H$&5(7^&sqOISEp9^WNPphK*rl9gbrI5Sh8vE=g*$!Nngl zDBo}>3^6Q*E{Pp5#u2x%ErN;7jhQ4TZJG*?bfFC)PbefT%t8n{n2h7bZw@f057b zNrvQ}F%UKt3ceTzdPHqaR!)g!P+fF;!h!l`CXX;T7Dj?_fQT`e@2V-uXsb#|BCKF6 zY1rZcahmcdlvNF2J5q;hHegJ_Il?2HIfpw0FcSpeK=KeUiiPd>GeAIKR~;w&P{sI| zWg-HEByn|s5g|;(ky7fl_rX|nC^<>y20AJRM0AItOixJ!q}3*gkx&v3n_5J;#UNH& zw;1p`CP^F~wnaNRB8spG1q1;iq4r)%9xy#gOo+90W9@bhncQcj5$apwR_aDv=U%oi(@~7T-@Zi zT!3sjuC0ky%TpS6NFMf$odn?V_7on|z97cq_0?l;R) ztEQ4U5ew%jxyO2H_bv~|n`7^KxSU>j_5RJ%^*4Xz%U}G$J8mJ&l*nU~=!{A^B8awX z`^6`7E9a5^VC@qj(IA{`B@b;V$58?YoU3^=zgr4zkkI%<^*c)B@%^?$-67!F z_73OLckrFg$zHHYPwx~nvE4m<+YiL{Be(~ha~M8RNWTyQ#r86`*M6?EHxEGEmHyi$ z4%_0G?t-#Ek=r%oQt-mT01)A0>w4F1Y+9jj@d@~yrhmLm1S7Q=Vtnl3#fyo%4Z|jZ z0)XqQoBsMMM5x_(NXpcQ!f&Mar6gmEnk9Yx-N#RF)(c{{ma_D!oEXAPV*~`&Rf({a z;nWE;2Y}^Nwd-y_)uj=0F1h#aX5)119cc86>blgNB_(!XHy`pi0x~ne7&qTRD-ZBx z>A46Z)wKgg&eGOyVJS;%eaueWy;VnyltkSTV1N%JU<7J-^l)HiQzyoC1Xzk`cXtyJ zAmTJ6Zg{?)2@wVa2@#MW6ts^)DJ3Qk58$?{yX7L*hdt7T*@h%^WTPgzUi2UQ`ZsbG z7)(AQL>x}Lv3{yfAp)w}j3EfH2oLka#gulLTeoA?B&9Lo8!}`moL4t9&5h1xcB;}zjpichl|8S zW5m^u>+#9+dxw`HLYwCKo;$9mMoGT$%fI;MkNr!;S=A`?Ge7p(ANuCkf9vo3!1KU@k=seZLxkF@X5-H2$CJS>m5FQj_0*?=b!j8i zX?M9h9jjig7Z-WGZD^3f-%PO=IGM@WifR^ah6FjK6QZh?l1J$D$XFejixJSY-+`Zd zH%W|urZ!lF0kN*Nzg6nM-RuCGoIUZSZimQ^|r5EnK^ml2uKcl_{yJyPFv)w%Uiv!z{|2v{{cxiI>|` zne(!=fS7j~JX);-&|b2bnfBQ2Cs*SnYi&6X@wFp@YY-tg)U^Xb$^rnjsk;&KVE90U zJ2dU#-di6jY}O2fQ<8A+YSWZ@)##o}T29T)Q;}AC*{5E$)h21uW@DbG>SYoJ?6s#N ztu=^9x%9eO0f3+@pavr7=7N=8dnwYJx`t%77PWQ{DLIW}s5dq9lv&lyEF~7^WohRz zn5#x;)K-(o&FxYqA)k=W~SZu`+^SZ(sLFO zHnrCJJWX!fL~o32C6RRnz&s`DWaeg?OM(Qa<1&uFyN`^U=gi@OHbf552M9@hK$ZYN zvJ6F*satmlFH`Q_+#+R$u!snU2%F}~dW;M*GuLiuWK^||2zTb=b*;=ivc`Ikk)t#g z*E#1}tD2Q5+W^S)VS&Iqa!W)6nY+W;Lpazz!H{!OwP7GZ1XH7&!b6x1z11!`xw=~f zpsJ_QW0;T7VipF%-gJCS+=Cb+qBj-cS{nci={cTj!J!8mg(Wk)M}#Ayw&6P`Brvrg z9{A4Il!!Q?jRiuY)|Ch&{BThozB1o`xZ54_ORrwsznm{GcO8@nF9$JxL-Nn-F2l>2 zFAXAyh_Nu?5nW6$THmoB7`E>_RXv`i>*KG6_+)dKYGaU$zv-~Kw-eaiF{FC|{9M3r}=~4Y}B2vdQnFRn4=x*>nifxBY zI22oQ;jr(FF7#ab-|Yne?!3m^@c&K_GUL`Ywp7c6D|8%FCDT8)T1ovpgf>=AwW=!l~q^x2NC!>c@Zj2i_V# z|M)S=lss^F$#Y5D&IB<+d$(n&u*t|UB_ZK(qmr~E5+;#eHBAX13;>ZFBEnP+Ja`gf zY*m84PN_Ew4IWvNp~Fo@g4TTyrbuvq zn1A+{zw!3tb>8nkd1Y<=GypOovZD(E6Oo|yfbf#=)yw_;Ljr@*%`RJJlQpunBkKX_z?F0dYP?(%t3TuPYZ3B#XmjV=-m)56}BysAI z@|-fMqFd|_iI~(p09&=;!cSRR?H(=(MfiAZtJ=~uWkKR~)oD&?;?uEvxCljzwk`tk z-h*<1@Wyrg{xJr~d@!0Ff{2B1Dy5m4xvK+hQg}uhk(_w<4 zBe^;!Mu3!vh-+&jApiH!D(<@61rVmp z)nYDOGIm8tj6?`ZOlC1Y@9v&51LCqYBIGpAq;U**nUiVsrnPl7ixK)E=f@xd`luCD zZ7A%K8M>A!uT=@j-5Cbngo!Bur<4K$kph8)$jB|4wz8Y*T2m>f(@BKQERoD}QM1-8 zm4pVSh9b04n36D$C;&jz?viE9&*q$RNfbytLV0jGu9C$p>Z%YP7CGnLq4YZ9lOQDt zA|#sTY~4Iy+GS>|b#RAdB*KnkWz6{9O>)+%WiBZN5uJ_;5+ei)xC87a}XtgIvNGQV1ETz=D zG6f)N-^4uQiWn+cNQ6j$o=Y01I3moud9*94BlA%r!n*T#A^;>TDXH>6Y7)}`Yo;Wl zheU)CyEzQaYaQ%T7`Yk%u!SLv5cdd?>-Xc6gyQMnpiQ z*0fA{uzirI);NxnYM9N`%fSSIt*M8bd0?2^?lA54>Hfp{;$C^>wTsJp^MjWThl?`Jsjih6-NGYo zu8&T+o%+3(E{?Yi0f;2;h=s~j%G`3v4q;vQ_b2UkdwohNJBL*Ga3VP8swKe2_W7)KOte5M?@(pm27PVB6lBeW)c=*Z5{+eybv*VA(0FB z7DSK=_oidCr+r+sip+(O=E4IidG{_yzu&wb<3`!^9Fk|KPlEr_?P zaV)r)$-~EF9SH$YhO&Q~Ymb}!5H)X;ZbEi*79MJIX1=3Aj8(u`nU3;$RR3FPbly2& z7!z%4M#3TSk8{%SC%)JAh4cxL{LrTX+*Pl4`^w=)*d+a9Me7l84rAFy`R;?0yM66A zCGJeXLkk4w2H;zTIve?ClQX?|kGB8V1pRk?jK9$KoPU_J{{K$lvkmgM{~LGG@m|0u zdV^1HD`IRO?*54YfX9!YJ-B}{X7G2OXg||%dk0|}pa1Uk^Phj`NB;1q3R15<6><-4 zYVNJ}!E8)9_0=OhXNd??n08YHtfwxSMY#8{ZL0N3a(_0D4;^Jlr)WF$*&t z5q-V6o9CPWur56nLGZS=G9`p)RY#i`;o*_8)Y@y)oF&3r(`|TZV~p7-N85b6vJ?sI1hICYa2oUbz>;Y@@%Y(e~V0O1<3>BzH0Fpev zRS75*jA$0qh>5pwj~m6S#a_!P&C=EL#5Y%`zP7M1m5E_HtJ>U6PR9zV}zu4^kLS?xC;y$8sqLym;KDOyO%%>EmH>pwfZ{OaZRe&6x> zcwG8a=Fj}uKlkQmKf7MtLP{_n%H^k;?DhJCumAo3Z@)QZN!ohOvYwhGF?D1DfL^Uk zc$muX|J;9Z{Lg;|))s2}!z{>C&WvTcEUl^oS$FHsLd)%%ip=|byj@cfU-5L*d7oYF zbZYk=?ryIabfEAspk20V`+e%_r&DK%#3(6UT~%a^=73QWXlv{3ns-ww*;Gxz0X$;u z9sq7?2FFwH>eH0gQwPADh-NZ_2xLHmSQg9o3j}EEhkbT{b!k03Cvos~wXrzd-RL<5BhG1X=-nKNhI=?AF?9$SxN&AyHElWs24U__>)IzKVrMy9&-QF58OshdYB(z~gWfx4rrF;j0&1OseBL`>M513)qdx3TuK@?%5`aV?c>Y<#MAAvzu04V zDajoWa9P&fuDEV;a{$=wOJBQolO(Fz7h@r23J*fi+UMQ0p4M7*-jyW62ML3AYLWyI zM)IyUZL7}vV(RNsb4j~>>D>s&)WfVtnWQ%jAI&NbhNhdRoCYf<ZRbYgVS{xB` z7H!U%A>y1$0Yi)~!jc#&jJs}K8zHWzI-KjhDp2H-Mr1W2^lF@#5PR*!lo;H-E@q|$ z5s6OAN=T`QR*L`;212dlg`kI-+L%fVd96p3oFD*cG!LF)6A6vw`8Ydj?WrVHAGK6l zb%@-ws|U<;X2#yUs}1$k(6zJBa2OL|N<0)Ax#V@JX-c-qhj=)4M%9o!7s9SOP+B&MIfUL#WRUa12G$B;7{`Gy%*VPuqK%G)6W+U* zcXN9A)x*X8`K4D5`@QThvM{I2+LeXZwcgyWT~%8k&~9HIzH)zEbm(ea;lZny*UxV( zqF(poaorutG|A2L)soB?)NU#gr%6<`w|;xG?l!NvLNmSR~ z)q2xZ(*9zqRd24A{k=KNb+u_%x@tZ4h&JysQLM|dyV$kG8L<@MM5klDy{Y#f9;~n6 z=n9g#ubK-3@%8f)6W+f!?RKTE_1UB2d?@aAx@prcmnkhL{lc$)<7;2~IJRH}K-|LB z5bx?zywmH$SqDGvha*P!E-hh{@_xs+L>%eeHoS{xY0N0f2MhO3W@9#F?HC@zl6tPZ zH%a`4$=Q_i2-_h44C)#7fB-vFgJSD6Mndq5(mG<;x3-bJhZE8#XZ&N14-ib`ZiEy7 zXG{FH7&uqg0Cx?*i>dD2EFR$QmEn09H5v>*|H(Gj-yV)QfJA4R4{S=Q?Jd}Zjbl3P zXH5|zLY(~r=RO1gAhv13XqtuZh=VzR!o%qc5Gl*u=ES!9AOqltB_Hn+39@iqTLh?gCLSw-(G)Tx zvz*&dWT9TI%%v_Xi*)Ty?g31glDOG8z=(pG5rBY@T!ibYX6A0YT~Q79U`8f1^C8m? z@Ki83{q)a&>G3hkhYMm0XQIXJn)B;yZgtAS2!~w);99MB%Z2kKw>NQW*l%klEQzK$_o`z_k~2Y| zlx$X)r%x{5`mQuF66{}l{k8A@_V<44i$o|wfjIAqX^c@TA&PJkx_$hSWJ-n}F}?iq z!t?A%GCIsk?UMDvW%ga`v{;O!xl58kFMOeDe{P*0U}aRN{_QiSJSX|=%+krTG2 zj-Inn#O^R70Woz|(;$dca+!0hZO~9`?E#TWIvp23QzsxiNeOcjbO%5>9ZxKz8W17O zoT$~#DYW5A59lNwRb`1eo`8 zJ=S?YuWM!EX)1wX-H^87+_am*V{D-tfaF0j0z#VS+1vo2paDW}noBk_#0~C8yj}BS z5H?bH0g;3lDNUS98Xs_C*s?Eq+qaI1m8uP6H#3e1t=@IoPpwua9vcrI>1GktFG@Bh!cjGczPcav~HS zpr(%0|?E-s`}W+67}A5N#USfOG!ENkofoBhjWj{odSTF0O1az zFOuBC)JI_4=m&WFM3V?>cR~X6aBwD7%b9bM@DPy*A6n|Ogc^{~!&HP?`v|@ik={Bn zn;9qSU4?}RhzAe`c>KqZ@59;9aV~BKs$|S@J-}noMSUz_Q>IclXS%$3A`aRt<(!8E2^o9uNRW3zh@Rs1_QoUXX=RpqU)(w% zsl&yY_G>Q^_+~qqDYCm2#GrxQ|Q{uL2Ahz14eIlmQv7b&oGDUVQG3}>Kb03=-6}GArw$JajW*C+22obnP+kK6T>GBzUMZ>UrhZsw?l0EgmW7an`~%nh0fi` z`1g}1&o2%;i11O1cmNFlDAtJ5za zh|qg@ScLU9=Gm5W3XgD~rqtC>w`-XbqO{t^Z$O(tL`q2;^lBo=0^491MpU?kATyXn zjDeShWa+&NbINHsErSvTF$x-FB+ldjrtZxoiJQA~DH)M^RnFYIF{67}4;F$Bb?qtT zR$D2hs}djt3L!ITGtL}p+FUXX0tPT3qM4iO=<#~D@L-YNhmnvFQJVq#;qvhR`?Ys} z{r4Z0Y3F841V|&*a`ePq9RUz102iccF={hy}NeT9=ptKZNO55wHaDZ zOz5D_rEqtAZ;ekECjebKA(n}?k1)>RjkadK-nN|i{zX}C*X2|(AWwXIT`k~nG1cnf ze)Ykl*Z(L%L_N0Me7N_ix4wS-jf4phg`l02dMA@2dOhe%W81 zZf>WkkYMl1=2vfjLvODrXI)x(`IVpi-~MlokFLJ?OTV~&^BcRoyL#v8-}}G)dq41J z|HOCy$v?Gw>#fLpVAfOf<#hYedmnx2_rCUvzj*q_`;#ObnazN0?PV5k9#IL9GS|hH zQ=j)~#Gp%})2S1aHMbOHE~l$52~tVxu>%bi8xTY(<#@aHM!Q2szfS4+lqxU^6gFi&OiRg{@B0$e|rAa-~8PF_1`%? zdIEq+AOP#yteYfELR{F*byajvIjuvsr6z^z;!9uKa&%2hK%7rk3*OuRk-zYlsM_cM z&d*_sR8WMD$L3qg7Uq=JX3K3S0A{+qS@W)3T`z?AN}>eOdjM=`jpmhg2VO&6%^>GwX2du)f#V|Y-AI5C;~aC_y9*-%wAxdWDd%2W0JOE|EUl^u^1Zn= z6_F&o_P#cg#Nbd8t!oz{kLbjXcwbZ9iE(_`IgOH0I>~$wsmtjq{IVP+FFZ1~^2m-938OAt0Hi)Q4oddYO`qbOoW_b%cZVXScgu>Ae$f zk#_Fp;p?(O;JlkcH2_*wVIsm|8*{VeRHxm*b?JaZcDxx4yQjvDs~7h! z=gXJoLAOgJlDO4X%~cz))LYFtSwuaxQu4Gfz4f-}{$fJF<4xUN&d2N1?bRt|neRxM)* z6;n?onQ51_-MNT(00(uSa@aWNPGrfL#TyFZaC#UHm z|FIwcE*713sW-iTzTSU06(Ox^z2AGVzkR+=`_g-BC(yav-Yl*5!^H%Kg!1u+&%W}z zAHMUor*1JgNNxsat+}5^(s%fOJlCHh+|>q9M^%T5W~_O~@o}zj&$V*k=sCl~X)_5B zk)2lx+iu}p;YMt`pce=re^EBWfK?258f;$KyYIC*0SF^v#N7gJVZitaFYhOc;jN4x zD<%jSM2b6)K>%z?Wwgm~Mt^dL>>tneEgpbR>>6I!aPO86=Sm;%-r`Tbrt#0%o!!m* z9kzZ5&)vm&pD=z7fOES9=Xd1X;=ox8bocIUJ<{#*bbEU|TIl*gV1@ z=bHMK~8(SA_scq~=82yQRcsN-0aMJ*8r5 zD3FQ(MASeC$&3h*P()1o`8B&FMuOg)2myl`n}+Fte+@Gtt?O#;05MOwZ9XAHM2jFE z-g8Ebfi*xxGfPu)x3L)*Yg0)a)^aJPo=Z_3m^?mjmx6_c0cFI3s2U5BaIIat0mQV+ zy(t8w%z$7913H8N$T%H#zx@YSKl2M;hcXi(00jUKIh~IC?dV*$GpvUzQ3}J%O2{5W zAPInY>1N?vxQ9106k^7ykai=6Ng%^HTm#@^hnQH*Je-7YPdzcGLS>TPY+TeVG))-^ zBoUGzTFz7^4hC~$8amUJ3zCvsK$eH!_UUp_0D%#97t^|UZ5r;9C>Qn?40Qd$NA>wr z`Sb&)9#G562Y;}y91;<(Fwy0|`2CSs*qJ%XgV%oeyQa%m=LvrE|Mk^y+UG)T{oTL& zPrvj}KlklF^gYvq2N3r3gQxZ8+11BazVtcqgNGOEsi{Q(q(tt-jIFvw`cltrffwA`)^v95i@F93L+D5bRAt}Ha~6Qh?&fcW;<2p~;FoQ}ta9@8!j#Wv6| z!~3*PB*+vv#&sBoR%YJD)~Ne?dty4=zfbe7l;eZi``?J+f#M+y|dc3VEXADFp zB$Pzm4c)ajC;pB<^QYhV;h)$)c&N9}p1kwUz3={kH-7AozxVh5KPh8IDZ2z1^OPjz z)*5HNzO6UMh6pHhd$WM>)zcd@-_7}riSOU&ht(w!ZeA_)2oek<1jtzisBSd4DW#Ds zJScCfI!#58RaG_;k&}!KX%O>JU~l&>LK$fQHWE4qeFJ&Oc>_}Bl(=;b#9(xXEX+d0 z!+1Yh3*;oEPJ~T;p0Zo3ivl7Og~LFyq$#aS12FIE4gnjzF#tv`c+P^15C#yf86b8u zLZV>-U?POD7~!zQL=JVVdV0J*03w_1>+ul?a7pn$vQs ztt<491508O^0AfmAXgC<=C!WnVz(UET+*0pI#6ir4kaK`W{+UOP&XqY5}`6DRRh8? zTV2;i0W37l<#=2pAYkZ5Ls)XQv-}lUAQw?H0;)@6qP4b>VZ=gpwch)=0&sU1VF!o+ zHD#eh`FMLm01>IR#=32`O}&&f_8#N7NjYm%watgSiNynQF7BqP)*a~_aR<|FXr*vyn7^n0mK#yfVicn1^_s2(ZidI z)!`g2c9#B+e+_ETxj4sw4f`|9w1F`cP20@<{7^i%G}{Y`?XR}U{GADS)ApYS|94gW z_8(iv5ikA@&-x^I;U9>tBHSJy=SBk0TK-RN4DQ~Y?M24+zfCywiEY4(W?`&x93DS; zK20US=sW@(i6{_g4k@#B14LnJ9sb_uzV-v3esF)H^;E~r|8!Jl%87b2Gt*=;X6hEC z!8|y+;qDRSRfSnq!(-%f_ihkDg1tH7$g=6Cj^Geuw=jam(YhjUzv?_j3u_l40E9q@ zAeMElOoS2U&WWvC_=t9hk$n^H>Jc6+VCn#VCk1o&ob#AhnQ9mW#+HiO`mjljF}%A) z!~o%G*9eF3;fNpO4Hm=zH{;B`S`ysN`J0bV|KZ>L!m(4y!%4ppYPIXQeZWZ63vhE} zs2V4LSMc0&d#u%-AG?{}96QhA1I3CM4(idWg*hThw;kdWGdBsxXWehAbJLW0#2$<( z*K(|-Bmi8F?QmJF>G2k)!bs3+KzI^X_vNVj!=$(M`1o;j)7F`|uXVcj5~Wg4eJWG$ zuIlyF(>_@@ZAKWk*UQV_@miYq?g|jA+FL*QSH9!F_gDYmAN*He_}Tx`YyIw@{8xVT zfBwH;o`1AFdbd4!6uw?RdU|~P(YwF&&#`JVpZ96bG9@`3*N=YtOT8Jm1JLfG>^0=D zt6kUH&AqiTPaI}O$cd16SsEhbDc7ZGhiR9VQ>}H~9m;xI$EB|7yE)g|)vy#DE>DXY%k z!1dH%p8nWh`!_%RXa16TTz&n^kS{*-=l(Uic*hm36JX%xxHd ztt$;uO;=7lh~La4Ob|Hu@er{r>$u5^NMC!NGZXfzvM&L#Htp)+Fz>~?*F^(iS(>n< zBCYiR8Y;@?H}%xKwca(5kP@jnAP|9BH+NSHKuM{0>tT4l<9F3Typ_b-&D=;(o16D( zE<^jA3ak3M_A+H{9wQ3N6?ty@p>^cGgr0UA$yCqc7W)$ zNlB^}4jkj&8@={CC0AdnrIeQ26O(Auk(qkBT@Q!3);?$#1W-?HnzMDCccm@0SDg1* zuh-f-GcBifd2jD-b?p!^&3QT1-p#$1sg$Wigf%O3?%md<3)AiG3b3UnO9F(jr7>fK zxO2*E-Pg6{EMrV3!o8b^GxKmpBBFL>W+G(fy5Zp!5P%SSkBH&a&q=f!5ayg9yw)D! zOvLQ14N0wnVQZ4;7?&$(&uK}-;#Z6N-J zyQTv`Z=HxFQE#>>kRw_h;$E<>%mfibchp-OCvI(xi4YNDBnpq=z*eGY->e9xE}6mL zyvhp^9`oA4X0pCvNPAZ#kiwUj)5Rgb@of(uJlwth=KaeDyTiSr)dIcuib%_`Uw1Wi zNz}XP$x;#R*1OL8?A`0q%9PAZn=zAC>*ylr9?MC!$8KNhsdv@+P_CYy%wV@K-qqFf zl)|w0019`|=DS1cRl9YFxcA_2_2iZaO@R}DL12`Uz=M&?F157_V=fFJe$$0WtDlzo z=%efF=k;{#>slXud{b+zr>^RK)ls&ME^fF~$B2-TP+XhkoabG+dVDPVGUrsUSD15| z^XYLtUDdC$JtB<4Y2)_~X|2adZXUyx*eE>barn4-o_z(Q?HI(K@#`MtuEQDWvsJq| z5Km*5doJz~A%?yV5W(Ya#y|QN4?j=8H}%Y&-vG`&a<|R(8)sP(4v7&2A&nS;IO~J9 z**cAoV>r+IVZ$l>H)i=S-q3SK?^&-8L*(>{A7Z3Gw3TA>j779FM1Yo`WD@OLrTM8WNo07#QItm$x5X|Ks0&`(OR>?<52p zOCmF7ZcVqD=y>FmdL1-3hX_f;LaizhRjm;~j0AYRJrVO5acS?ll9BmR`r~>LQ4QZQ##Z8>_1< zLIjLxh^{)KM#5cEYP}DS2r;U9AVTb|8u|h!BtEp zZvlA-LlqD-kje;1yj_S8;lWgq!5z9GLdmRvA3j@3VMns++D#InyD+GmArjt9rQ>3^}qb)pZqiQ-~l)s<_tLH`=2WN{k!F# zm})NN`5(OV>;J+3@#Y&})2ENFK73qeIzC?+89grU6${je(``NM^X27)fRw0Ad0672 z#E6GWIi)0oojFO8JpZ)Cj{i}a1zww=+-kyH&J3sv&y#33c+fNx0&EsGA z^MC%^|GR(X_T8_2@xS`n-~VU7MBqR1Kl~qm<}dse@XEarA!bC!wRK?c-Mf17kc9I- z)#kO?Zej$uI7lGf-qd}@*LL{jbzs-X)V4c(ga}FE)2Zg1x6wY4`|#?Ks)|UjeJqHF zSx7Rsw$&daj$=&62WxUjK1|Ksi5UVsVz6HbiA!47<`EXbL@Y>*p$^Eknpq%2VN8h~ zP|XIT(*Rtz++UACjFe@>8My}%jY;qbF(8O}p3H5ygO~|m=#&Hy0xTtIRZGqg5jNI_ zsa8$GgfNgPs;(BCWE@%>0uO-+-92$e0gnI+a8E@fu?7;+G!->VIZ0vzXC`Cvv7BTY zzEZ&0?RJug7?~`WOavC5HI0$f;V=)2zpC}7fWe8IsyX16k4a_9K)50BH|4bxv#Gnq z;bL#rMW*Gn%=@XWO|9pW0v!TSFdP9r0L){zFOu0UnK>X5z-~XWFp;oOX0d>%J={_f zA{%kGtr`ihwTV-Bh_Hn-)5w`F(@=_$nIe+_Muae9j4Q+-fEZ;%Gs`#zd$aJ!B@Mkh z5)MGqG$k`{tz!bfF(BVY_#@oa+=uyrhqFs{oakdZNW!hQw3~+*oq>qab>qkZL`sQ; zm@y}Dbwu1W{atfT5s^e{Ybg!LJr3pPP>|brJb?%WfCy{oC=pU-L>lHVH(X6~NrRX< zV5~$TiECB0VPK_P5;M9%BI&J{luF56I};(saLSG0QJM0F@+^7O)2;P+F1Cex`Ifps z3=9b91Q1wj2Z8`F_Yw5gy5^GH%skAt*%lGXc2^|!%^1^b%hT{zFd#%&E*SvA4T;QM zSVV}J`Vim>BI3w37)i`(<~7_bZFUg~aF6Jw-aCNHBuse!!T!}x-FxG$2d}+;c;!=v zl4aV9bvKXR)U4Lt5oujJ6A=RnyP1OlAtm-ON|;DUC>)5Xwa&~rb1+#QnrA?QRD_65 zx9haas42{MhZz7$PF=lQTwLzzQJd=FFe6iz6dtYVv@Zx~O%E3{P%s4xM|hsn7^k+i zx7u&6mgCL(^wIHjT%SK*mbG0yTh)9ysVjtoB-)BSfGkNS8O7nygKTmXLLajk07RH} zr4+e%xEt(~+nc4I>cz#pyO>y{o+=aPDNj?f=I?y%$#4GZ*FJjxh=94IaNlGxvE?cZ zFRz**(nwVrpRcnre5(cnVwl{C5k67b;`u*@Lt{`u#|mg58pC54wd2gm92Mp$S8Xt+ zH(89IHS(W$=AqCVn;|$mQqPS4J0VQmWfhv`7XoL|;9wjVF;uBA9Dh+ZK5@7}UF2ZxOd z^ z&l{KD`__YYT)V0y($*tl+9hkg9M_AB-O#@>lXXjFFfK5Os44(VBNwob&~@z1%}f$o zSLZF+8yWkMkrIw@pYdV_0xtrXxwi(xnc*=qAPEi56aDe4L=3Y4h%if8RKv_UbFXS< zlBHGM+(>Irc~I>@L`=1JBSI!tQ!|^Usn&|HC6#J35(I?a04X9u7oYa2A6L^zW$H^O ziD_Tnzi$7JpZmS9eO#xK#xaY;=C*yJU}y{|JO)Dz5X=IEjvk8{o2SBc?U=a%pi%-a ziC~|vu1{_;C#q{(yC0IQ-H>b_hz=gkAUCJ}Jo8&cPPYq}9K+;|w5%;p^KogZY@XL? zM`mzZwVN~3&25v6Owd+uOTYQ}k=4pMc~$k!rTmef`tw@hy)XRU<1c znvoONwJ%lOq2x5p#RA*XvM?ecfw`YfDzgZ|y~|k@jyLPYy;O2uYX<~Cy1rVcIi*Ap zuq=I=BXM3%Jqb%hZ&r5FR^1&^T}?4cAvIWzZQ7^PZ7U_+d$_k2*H_1BC+pICw=xML zUO!*vT~3+ZbUC$)`?EFEYA}Lw2#Ikyt&VXzDrX^K1O$&%`2OWf``148^2@J0`tlc# zSEnEOi$C>UfA!z&fwrEoFZ1R7+YjG)`dk0x^4q_UAH4E?f9_6|C3*!kf!>jfAaTU{lOpHzwyf9m6w_tEjna!r$xadB_!t4&6?)4 zm^Q+CtyAVys8^)`^eE=$&PH2kgl)r|%}zP?gMcX~>uwsr0O+lCBpe@0aL*;RwMVy+ zztUPCx|dO%_h!tL7?G2ir6fa%URRYw!o1dgJgxJ^)M(*GpE5BGhjk9Gwt)7lCU|dSvZhTSEG&8Nv2+FOF8$hfDrC$)scicD3GdVwn<7< zeUML7eFRpB5F={$QT(xpHbVrF)M__#Kwz_!#hYo@GLT(~!_)rE-&TD1+W-OW8zHIUpw&8A(dOK-Ki`_;4K{f7sD=v7lrwYIwU zQWy!=Q$rkyq+X`Mi==h!YH{`KW`GBlWksCEuk5(Aaoabw+Kh;&Ihne}aBCZ^?BQx+mxS8u8az`|Bt%|!?Ta^jSEIab`xyC9<0I|eHIpqdWO z6)|FTy4KUNnR)#Mo>;gIX9J*SeSObH#4frXY+?bWZZmgDX7tLLYy=f}q%-`w8zb_8-d?Z2{!3r^$`?QOvz%cRgxZy9Y+W|;jc$&nO-TkiqeeDKs_@5pe!)5!)ug&kCOa!1E&Fj11Z!N8joJ_-~i~+dLk= zrPkjH{;ks(kH<3?==|%)bIWn}CojJ0tOgor|M9Z6)yZ9FwRKKsx4@lZX?trRFyQvI zoR+$qrxEtnT4!MdSe9C*(wdHMB8kzkRrr~I_SJvur~c@}5qcNSd2?Ve6A?Alwl-Cb z0Lgc>Yz6=%5Mo4P0dz+MCNc_63|qjsj(}1m7#cyfaJS+1Kty614NbQ`<~dBHZevh4 zBxNHyBs?f_;OLuxg^3X~05@tIF(Gawffy%5jMPRNUXX1XSI#?5? zHbiQ~$igg4L^3e|kifJn?>t-ogTMRLuYJ7CC4oB$K_D}YraNGRtOLRb)bI!b5RrhW zh@Gf#h|q50h6s!^!^3;K!#-Wz^j`bAHUI=dCj=rRudD7j?Gmnx0nh@MoSCC!0l}`G za$+%UP%l|GQPLo)GnQ=*{<@Brn(f@P*>MP5$$Jg&a23_^GvalJHl84W4E_qjSL}a1m zRO_N;76PmuZUHpzchIV)ENRZmsVz%mmibVSpjBVjrriUv8`SGlU6dG80cOcL)wP9r znbN$Q*0l!Ux@swM@BTcN%7Bm(5hq}<-Z*2*=^ zGKp(%OYLiil=d`*`|)~-d3x#7Z@xMou0H(u>H8n$eX2|Q%=drKkNz+ISMt)Q`iJlS z{Qv#`a{K(|n_v9=OK<c=%;@2JO9$Zk?z0p?SJBr z|N4LWGv@fl>u==Cdr+75vkT3xl<&Fw0}DKRn=BNBlsB4L0C69*yIwWo1; z5y6OnH%~^6zL|m5+XGgLKrNVWoDan|~O}jjjhEq;pVPQyMrV$bD zdCDoXFpu+fnmCt;h_-e~oN`h%m@^_l40A1+d6^3$FguY9%b+kLjyNIGZa_fH5kSO5 zluI5%w=D}6VzA%mB(?UO6OAHZOz&`$EDTwiZ!-05yfOR^GxLFvaXmFesFbv<^I<=9e@2<%OXsO%De2Eg%lA*6X&ITZo<^nNbuZS_q>ml^pVo3mzOm)ns5x{LzsvzPg z;gZ5+5gw8E`R4hlpA;yVP?D6AZ?A82VMg+RFMa;K-}(GIw^u8pBqjn-w^2|IgSeX$ zBO&&)nSNYjLl(r$Lq&NfG9Nk!0HAY}@43JnM+T09Z8R0*zOQB?GD=(Ve5dMO( zgNR#nZ!nH!=DD&bBs!;1BgNe?9bo)kwN!F64TzMuuHDFU z5kD9D0LV=}0L4r86c`D*+fiP&t<6MjY$r2W-N+PX~yCk-%#5BzqLB00*kk?ZqmN2*8 zFAn7k?_B-A|Ld>5|J0@=BWpm47V+rV=ph~srK+n%tttor1{N(e z94_xq(X=;kx7{w+r48iEay0GrNB`G<7U@nDg?Y%E4= zN?ZHwVkk6p#@1C^>@R0>yn24xU8DdQP>VeAa%$5qtJdR93y(5Wt)Ol>q4vI>x>~nx z0hTTwy#6D92!THO{O@RMum8{w{o$Ydsh7UvdqAds{q)!Wv;XMrU-^wh`25M!t9Ret zPrG&P+H^O|v#-DX&;PxD_b2{mf8(X^`+@btcfa`e|51N(ltf?thyV5KKl0Y>63(&~-=`(A4YF=UwVe+v=P!+wO6#d{g3Z*(yva!siLf_SwQ0_+c>txHh{)6;!p*AMVDNXfmD*Ht zHyWW)DWx){!GRePm)($A_?YwQyC#EY^aV%AAL4Lf4js#~`-VPK=zWH(gG3 znleI|h0~^lhHykNwSlZ~v(srwDdi;It(4T8CP~bs=DqctQ(F}gkOLegk*T-Z%alg` z2J=9MvNlC?k8sl@5)j%=VeBr<-AOpQrz{v~-Ez6(z)%t%%6o0jg2JfXSs2}szztgM z;a;Xx*Up046qA&R39&bKH$*^;!2%dkD}d0ht#!vBhW$l)^^N6Iq~uOl&8$wpuu(*r7m5B zcl)g7$D2+}ef2!a{$g@%vM5*L7hKZwm8*(hSAR&Y>GZr#+ zgDniScO`;BWDh^{GPgPRM$6Q0gHWtZ*QGvtbk$nl?{@8^ufFlp?bY%2*(oLAS>E}| z<1hZsdmp}c4UUNia9m@kVgTH?aIPWF3EalRt!oltW<*!DQ8**QX52R)dCX&(0|VMK za!UvSw|Ixa{22;+M<660iZXWq7~1+FF5Sxa;RnENJninV#a#g*ZT4J1^FZ+P>wjT< z-9Ak?r0L_8e2Xq7?tHTzIHJeyv`28peV$_q&Mm|iHQ@eYQ7}|du&pcZ%4zr(3@Cn5 zXuk=MHY)1Y!QqSiFE|(dcwQgiRW*MBtvL)SK4YiD0O2ao{omhYy|Utd$~4IYuE)gyGIa zrb;v#1RS%5yXIy*8w;FieF~PF=%QOCkXD0CX*LLImOvrilWU|zL}|>8FD`aw!!SL5Xm7QXkO=keZjomp07B%% zK~4nq49PrfI(Xj_>-R|H=RK={LW*JbHZl z_}S-w_HX~_-}tusZ+`mzo3B2;c|K2Ry}mhp{Qk>-^arU-APGv^U6kea`0T5{zyCu& zIKA}hy-z(@uHLQ7Em#kdm%igO_g}iWy*>%EHjK7}+5GbBm#@Ek_012%AT0L#42Z{@ zdhcS7*f0VZE-p$l!`S-~mC61A#hhP|#`k_c1D!in1&J_JpG0}Z5ZIb|i6G-j~Kf*4d=Lx7Z% zd$6!J7iLa;x~*ZZX7hf6h`NrAD3&P!AqXIV0Hr`$znQ1P_FSYb-Q72n-e`zJJT?;IaH@dfxV)LDo6!*D zRO_l^!&`E0t?l-cs;0!?4nuJvB!nq(TN@(ekyI@-N+?1KihwvRYf6d0MhDKq9*)Fn ziU@$fM95CWK*1to=8XbL*ex(%nzNc|?ZYp?M3UJo)Kr8)0{}*uXWco8nK6+&xDT5+ z##s&>XRjnPvT!v8+9U;%1~LX&(A0n#Fj&U5L>}In_HGuA?Dy`^Z@zl**0b(-i6=%+tBlLMtT^akwK;ZSBKvUOoBf z_WASE<44bLZ|ZVX3tyXq0|ZFoa0H;teD>i0!d6(T`OxvJMMMz6mcfiLR0E?7G&Arm zMtVdEjmSkD*O=S5N5fz}A(?q9$<0sK$23oe%SlTzZ~KcZoIif=`R{-355D&058E2d zLV|8aJZkGmi37qNN4Ddj?gAh(Mg$Oec=P~7k*#D$M8eJ90|0}ZHgxGY$nms|59`^ller^53*gD{gR$=U9#ut4H2J~(Qe>ZnO>vOin zz+KgT?m0F!|J{Bd?p6SIa(_He@?U)ICt8S4{LLK^=#xDSjSl36qG((~daD}Y1H)ogB?$nwwdb6W$#ejoLc2555UWikM}(?r@4j7s=g>snmOc^Cn<7CQ z=X#RfloOc^8-Pnn%c-WsB%Aln(5?HHB545-Zh_~ZQ)Y4pRYw4AJUVzTdw=Y+7oYx&cm2k%{Nf+{%5M?( z<4M2wvp@Xff8&3xq3w8k@y4f)@4f%g=YRFVTW@{)pZv3Uad~|5@vr>N|M-K?|L!Yq zzW$?s{ck+{Bj5j-&;G=3|Mbu9ru_W952JT}@XG#`*Z$yhUzn$&8mFh%*8cxw{aLVO z*?As_{nJ`|pWzNU*Ib1vRDl2i5~N6hBE>@7sUy)E^(HUmo4K_MyIe_s#b%-+FuX^7rA% zldF@{-Pr~SsagW?VaHv+JidPS^7VwwIZeaFNxDTY#e{fqOjW@Q0&yHQ+=xVLMAZ|C zC;RU1#w9V&3JPl1*;+Lv+3zPrbb#=X%&P9HDTzB=RVkHHnuMbb{4EMF%q5Ffb>}A8 ztHrJT2VyD8!dVytn-Jd;CZ@($n8#EqBQ{1KTGlul5l5}f%zYu{%NFQWpYRuiHI zzs$X=sYYZ-LLQ;&0U8d|RGC_C9J^Ol13*=0CXYx-YPC|e1+Xwt7}RS0sw+dS7X3Q6 z7T%P(6l0;B*v-pSBylOVOtw1en84LFOlxgCS*nQH1JcSJ~~)TSvH5%&lUkrph| zgb>Eus+wT#Tj)}Ao3uSGKv=bgQxQ;-m|0OpB8XOh>smc0Nr`Jw?o)V-<0LGS7&IEM zj|dRX!nG&~ntGrEp{lwyyE&+OyA!E;nJi^?wF2SpY9>rpt?JPADZ;{h8a#JmX0=)% zFkvk1gYcXO%j3lCJ=GNkFCv~@w zL`{bwLSYadVc?)+sTRS4N7oi7Cr3{|cl_itt7o1)J~~<~kCwab5D^}>+thI|K$xbI z#?*IdxynR%aklB#eac)0O<9+i+?30I(+ki z=!dJP_1ND($}c+n%JaB%IOZXn=>Yw&)&uycbr{+*WoAU0696#)Kl=E=YPnc1yJiS% zQp*OiTk|e8ovuM*q}Ae|eC0hP{0l$wDWsxRF(UP?)(XHqb@Mly84?kJWY%h}CkP4M zj9G}tZ7vLMry?TUorIXVmde6oErb~1$nzSdjf+j>1I-s75sneoMwg~+6TxcMg0x$< zotc`}uJ3A55e^F`3Bo^z|7-V`$clMuH&2* z@7~}4{a^adSKqvlu1gFM)rR08*l0c4>u@-Z86e1!L9Cjt#SF7I4&5ScM zlb~atkP*>+bPvcKrG#3-Jhs~*Jj{Y477Iy<4x#}>k0c~nkU?_NP-N^E0?dI?#wjmT z2C9=1#_}kqOyLTQxtBml&Z)~fRRADCkI-V>DrZDO+D+whS5n_cf$eU4^z;+o^J71G z>*ZIb`)A+zx4+EC`G@|}Utd4-39C+t?|jc^0RNxw{`S`x{qp?Yw0p?6ZZCTJ_P_im zU-~CMKRnoc{wKfigMaOB1;htm{nDGi^5qWUqv7p`uYU9NmCs#&`7_f051hDKnYIrx zua{3ei87}l6KI%r$LpKVKJo6okC>@jrfK^C$_~5!^x0=p_xm;s?|tdlKKtpia%(|J&a_UM;1UGpplhBn}~?>59AkSlw|dN*Jp} zTCMxCtuASq{LTQlYk(L54}~ldgj7o*MnEz(X{HUB^S^V>EX|vR%_SxxrpC-_>OSj+ ziHVpXoTz;wiG_(UCq`}`2UmAt3_{6LC!NMR9cr`zF(C3XTk*-P493DNfWp&mLguPU zlvpTdnI^5~yRk$I7!hjMR*PV!lmLl!_A~$z?RHa35^IsTBn+mgnORM67iV@l07-{T~DoaZz;-M9x{tSP?N=LpHN86LAA}xyvMxvRIv2 zDnbNDx9D{FucYSL2fS~v7MiClZ2hmu^O6cAF}C4WtrRm;HI0blYl|mey7v4_ zH=lg!+Vd}7%Ne@`dNpD>zrR1be<_{R;ujCMB8*7O)gonaGfCJjQguDKc9eUT#5iL_~8l_sb+A;D}9QQ*F8GyFS;V;bdXL)c4)-(LzWhCot3+ z56(9C?{7Z7dvS5TyMJ%D*-T|_P6$FIBxdQmR)q^hXzG3l&To7_F%g3MclARdVk=~b zIZLfAV-6AcGx~xS9!;(Kz!B%1Lj;7JWLBxEH~iLu4MYfl&2V=yEf#civP_AGeYvwl~;{L}Atr1%PUX*knuGl=H1T$(q{D0_V7WaF3QB;0{fa z1P9Cp2<9ftFoXMm2%9TVW(%Qooy#DryIeeA0eQY+t#L(N01tEmH-{v#3G_~495YdwM5+rKtP88_s4}dc);v) z3J}I)$ zV~-f~u4I05z#Mm~{?5A}e(IIy8KIiH1t)UzT8)T^xz`X_Ca%qD+;U383$jws>Pk zYn6@QZbm|Fecw9Rn;=T7AqE20;*zNEG9WOL2=zJF@Sp#!xBiDOz4u^*e$jiYAf1&( z4hTFa+#w>GIwuYb^EsiS8P(@yOF%%F;SMl_d!jNHS;$`f!;de=Rn9$)gNT|oT`m{nSZeXM*GQ5W z5B)w>BcKiH)4ue5S}Za!O;gKZ@@dq($U2!7&3#t}O_|L+t&$b9NtuZAEE^EQ-NkMk zige@%DP$T{3A>cWQS-^kCx7CnkDhqy?l-=EvcLR8f8}o+zwj9s@iLx%>a%IVU6OZx z{flSsynExtPdxL5AN|~)|10-je{0n9yWe{A_x{n}`$PYWze@xkeEoOsfBU@-;kDoV z^2HPr-Qwgn=45JK{qnsJZ>h=gtrlHk>eJ=6>;_pZPH*3Q zySmkI!{O|*o_m3pIScu?6luH z=BK{!1^wu~kG}q@O`cgSim)KVez4)eJ_#}tY8;>R)1=eIczU|r?S}njT^UlaN8>wN znm#reB@qE&8B5pa@X%@^tg59b5$8VDG9iW}DN}8{Lz$|FwaCIS>sK8F)Z*hW3pdrP9>LBved zr7o4Js5*d8)1=kg<-V#x0JznnwN^JLVKbXbv|Nc&w3MbMg=s93NY$oNn7O4{NJ5`% zDh32ZRJ3p~pp(G3k0RjeETlC&3Q;RkRbnio2F^@gRXuxfvFtl{ABV{i_gg(Aays8$g+_3uoXj3AW*hem zfVFB%=uautq5u)-I%k&yQ-rlZSS-^V8RzCKjN!RUT5VRPVVIg5<}46iih7)>2LS^!Zk+8s(55;G-st7;wrr5ZDuT6mjk zoe(t|f60xiJmjl1NxC!BG!_x@)<2-u^#TaB7(xSWU=||a?ph5ZL|X3zHm0xDy(0h- zmSVZjR;}GziP6o7TKtZ=M@p?I62hTX_l#pr!r@+uHaobP1wbj9lgOb!lQ^0BH0d-= z#IRVWJJ;4PeCp1Pn~Nu(JU+eEtxuQJUV~t_88#a;wdJB;AFokpdpQtlzg%=3r!LpY zr+r;3_r}d;eE4wp;rnL~&xebPsT5OnVVV_a$X(({007Zw zV4K^-8^~(Per?%_EjJ9J1yt6lN|Hu?GgE_FlEl>JK19N*O$tE(Va*_mSc@_fMkJAz zRSFSAs70Hyr7e*N(X?fDX{|xX`-|PM8Nc~^@4fZ*{W2N@C8id|)`N$JJxa@m zWoBtDMi77)=FNxLh|1Pz(QXPYJ7f01%t<~J5X~NTFgG|cx7^Q$XWA?p^WpITb->JM zM*PrP!{(Y`q?Qm3(CP)?pxS@TaeGj*gwK?>w-&HD1<2-cVkW-955&4h%Uy5f09Wdp zz&XXqJTC-%E^ukXIt!UK8BzCv(AR!UfssY#(lZR(QRp(@qW;#hZMFfU30Wtw#DH?O3 za^#c%Ativh8;G?ix5kmSGxE8JMAeay2sxo2%ovB)6;ftmax)=Xue;QxuYTwLfB!4r z`GXJkl5*bxfw!#|GqheYf6-bT&?S*sulG*)y0ByCJQG) z5*kJ&hCn1~*+fW;0ba~w0?Cw;lu^f_^h@cIKvWSX0zz;I2wbhYmRu2pQ&CAFOm(Wu zRVM=6NYhRTY21~?x^ppvXr`jvF%hbA2rD=P)LJ7jFGM;Scctr70!fL60v?_+W`XU# z>7sqLUM9&pmi@S0-MsnSkN&{z?|FrnD=&Kf&f9PP=2xfPz7#*|mY@EKKapQ}`N_}! zA=rF;@9no<{namCd-ADg|L~74Zr{<}gRlIj=B}>!tN@7!M0?o!u2atmi zQA&tR3?|IEOVhqoRe&hPTJ8@-Fe4|9fN?)H5kDeImiCE5jMZ}K=A{}ZY27bcwd<24 znZ_nGkL5b8juH#)wxi@$-UJcR_sP_{PFSd4=5ee91n9`H-%g0^?zt1292tN-Ng|-W zm*qMO(J)m2GBxnm|C$HGb4@4MTMZL_~zc2)KEQ%8WbK3RBmWV(O%VwmcFJ0+ImYpZB2a2x?3 zOesmX?8jkbVNPMy)GT#eRFRR?JemxKkzi)4v55)*3A&WcoCr*fiOX2=;L1XBBftP!}dPSFfszMbAtuJPi{P9^?lBfXpO>S~UP_QDS0bL`;2VYA#9~N5+9)Q> zm5dzST}Z~MASHzG19-2hecz!V836(dS_z0q9V1dJtEyESE!yskBxq)!$V`b)53WZh za%_G_YPac}MVQQ;ogf?tM7X(lBb=ZOhVTq#&Hq<1E zRz;q(gNO*Zar`yq6anN{d3OLo4nYjeq*_r}Ti<0OB6N?G>POwGKgn%U8{{^Zu; z`RA@b{le)hpMK)#sP9&37)PCKtkc7@4Fqy0!!YUO0D)N5x67lI2c$mx%&=PSMe;&j zYqg^4Zhe=haq5<$rtPAXx)fep#UTW=_^f~sK>!Sc#iD1y!Doqp2qnn`Xb|B3@c#b% z;n|1pT|7A3-oL-w@5+8xxQPz|nP}OkrX?f7D}3DK%J8WE3EG;G`H|EDnoy#3j(PxK z?$SZ44AvTEW{vxdozxl_AZsy7Ikoutl(_-B+R{y8?!d;mCAyXMU?c3^0SVT}{heoS z{r>N~@%7(*`{KMHqOdSwt?hb`fMkb_P|M)ILK=U`Ln&%ftbSP?l4vJIr|7_)6GE+{|FKtQ1q27=Adqw zVJ;rb2d!1383!8We+c26ll$jC5H-HP9mK;CiJDRfu3$C5!F7#?@cqX?{uLWPKf!qb z@Cc$uh`*h&D{;&G69=|`{{I8-d)NTX%AAPD90GXwxhn|}&g1@-1PBg84IFZT9vd|d z!AOTQNC&3*(Et&Fh?kf9H{br?#TTDtRr6U%3W&A z+c9Oz;bz7n>hQs~4iH#tx9XWugm>GKDNs^TXG0>IChK}e0N0rN_kf07<IOb$u$OTCvqShr@m|^{Z5dN&u^)uH81qeaTr6sf=Z@%G0D}w7#d*b^F~|bPB>@ zsveH5!Ix>O(Jt^7KJKlh5%#No91ACM^=ewprfpSMh|Y#mYryL0=;;^TZ1eWpIF1JK z%uoLGCx7avj_*8^R=w4cy2Vppun3~j8Jw%+3nNm zk#wC^3nneP`S_#Tl=$cxGETdRDeW)L>+VvPC*5kXxqpU;)5Swmqt$iJonBt}RJQl- zRV@qwiz8h10Tve5pMC!5nNJk=qffl@!+-LR{ma+i4=wjU`1p(ekN@(<)3BG?_LN^WlI0NCQZaux{O?Z>|FN}0?d zcY+b)zDgD(8i!hHYceKgM4{bo>igUpZQKKy$D#E7V!7%aeb|<8%{lFN)6vNa*vdwS zp%OyB%5|~;t5%lF{F(22=Em(+t;NBcC>$d4GS|r=f&>?fR3{IFKxgJURX_&>Vs2dx z!i0#ms<6~ayG1HvWv0bRLZUiZT2Lr(qEZV4fP-{wI;Yg-o?Q_U#xfyN9W7^)B#bmo zb#c^rv7EUSou)!SU7s3{9vG6OjuvhntHrvThME_tj+**Z_Lh4g#yZ-qCzj)2-}>5n z+slcCgt$z#Tju?45|Naos0xdlLj*CShk4X-M1pB7Evsjm%KCU!i>D;+UW=QR++}OY zHdVs|$eD-|S+!bf?sKzMn_DBWbC=qqxO=TCQWwi3^AQM-E{mHtw`n*0%*(J0UG8t3_o9QYl{DSlHdP z7&l+CLpauI=Al+peSO-W-s+zI#P!>Ejz017wVO9q*Ke+;eZd5(<)e=-cKhk%cqN>7 zoAKymb$DQ-P^vfGRn{_t$Oy&U^xrw+ruA~FER6;=1%z=lK#(ls zz7SG4)?(c&rGUDOr|aN$q}g8LZdk`nvmVBh1e2NGy+=(YjAfiqot~qn6xM! zXiB$8Db-R5upyr?n=M%8O%vF>vsNvl33#xTv(K{ghS4J+;NIQMe)sw}zV_B`Q(FO| zR*Si*B~lU(N0eIC-O;e&~iXYOq=OS0anDaoPjp*&>az+2gRe%pZhI$`)1H1{Q9%1P?#OmNI zC7J;<5h5HaRu2P=KT_%AApq3p;Q!X|`Y1lQEhT1|kRQf_11_JRA)s7Aa6jn0ADd1d zWpuXL!4Iw4ILDD*^`afPd^{Ki8bE(+pMV(cL>y+3M|%c>8PQ*j95l}okC~DY4~nKZ z=$`=M(chh4?B0C)gBPEF3e=i*w(S7gmawq`&{TtJLUFWS{PvrhckX@t-}})Qe(0s! z;BIsCpAbUI;%f6r2k5$NZth^Hb=2JDZf+B#$g_jKy*YB9F~D5gnueIn4T(I$N^SEi zBC?Q2Oj8x+lq3LxsEu9B*wk;TCHJ{ZRT6XC88xXtp$NIThhu<;B9m3)L`~|~YWI-m z^W11oBv>r+uK2(F^1HwAm3Q7duUVw;nudXhsEO_f!2_@XK7l@|UPehBHkJial_e1G=+3giMn}>S{19yB9>7$X_g=yn~ ziL-RoygGzC28aj>vLG`Df~2OPAzFe{RP`j{qHSeCOnoQBSc|4UC!xNVX`Bn>8DV|Y zrH;d$ndj98&h<1zxL9RQJdK*V1dQW2O;hc9CICdNV+bNLbE4gTY)O$wprwRUDN|t7 z$+hey=cz!Mrqeq&pZ&rg?)vV%uYP&?#8aR6(|_sar+?`3?N`6}fBHW>c>m!GKlGU& z`8)qn5PkUNU;FSIzc&s0@A;WOckQK5KmQ{?_SRRv`ti5kVxy1#;M*79`q~rU|GDLI zy`n4I9-D$b*uid!#=w81{r=NJaJAD$DM=$); zpT2(7zx7MM_`&bLmiwc#SHE%o;Rk1LedpcZ|K{dmn{yH{2)p>;-H*Td2Pw;NK0W>E z=TATL{b4~gb}5ce`qbr%Vf2vgW+WmO?E19ZX_u()$Q^fk8#X0%sqdI6Zgg~K2@kda z5h;tSw@a<5abiwVc7q5{1t5ZjSxBOVXdx3Kkw;saiK@0YISbpQU7wmRT!d1W5S5tB zl!(Ut)b&|fMw1#6O{Mmd0q5Of00x4YyF>f1t2U=H08}70H71-ifOtO^LJEY2pQIBv z*9xX?>dewDdn*>L;+THYN`~~fuGaLYY&MMrLwZs_K47JvE zqN-)8?RGnkB_)~0f`ln?IP5NW?H+oSozgB)<5*hWG|Zg_VPP|&M(AqX$_frW?o%ne z=o?=+JIdT7rEw@N*uK#>S5jVR+0770I1Z&TJMJzyA+~IOFte1qoRNfTv2d6z2iQ^_ zn;g_Kvk19ERfhm#Vmg%iA~a4^2mpW%$^GGxGHY%AduRv5fW@Lyvm`B57Me+*Nu65O zeoE+JOjL?8VOz_z9@&%_no^f%_BWdI7=VaLpm_;YO)VDdbaK*t;*-~(c;e)_7j7&U zzCP`~Xf4J?}JwVjSyjt#3M4Vh-rOc@l#7K#js|-YSG-BNC2PRr9drGq3 zj@1IH5#xH@*;UH0;+2kPyi;gu~`yJU`og@a}^L z_xJZcx;#JM@3#d2U0bva|degyl79d9-*Pj;Ia#=UA{t(TfT@(6v#N4q7ZD+Xi9#eGTGGF&5rQOv7OV+vNB{r~ zpEtveJq`e7Vqhc+H<;ZlGn4LcP}oDXJW#mu86U(>2OLZA7|3pX_v73=Ara6OzkU^p z+Aa%MxHo3^(d?Iic_oPL2{aP?%5H&(O)1oL4ei7>ZB07@9{e`VvP>>&@Obh0rwHBLFpvqgT1u?ufZP;20LVxlzUtW->}rVA-p6h(%$%v# zsHFw*hK0B6MUetZL|#o$!%^nY^v5ofVA0+!@jJKR_+lFKyyR2yK6wZ`01djV^phyt&h8>o;Xd+ z5O%rQpP%bukppZhRs{FE+V?Vyb|Yi#%z`lDqQtIZB3F&-j&3K%{j@JpsmlTY;V|s$ zM0(@easOXJX zUVi%fKM&R4`Ry+~@xmuQ_3!;pJ@wZ=|6`|5zX08O+-^^9ogN*Zp5gl!_s+le5C75b z;={Lp>vx8G7e;V$dUEpYC)4q@8_$2@t>1oanR<2H-9PhvNk^y4)1!JZ63N-S@0W{> zTw5)#otCkVoTtIh-hIpVyT!HZl&J0p?sMI5!Et@_c3ud$Bf|9Xp4Tz0k2s}aJNA7{ zn?a`m`$d0xit3EmpWICS(e>wE{{El&(_i0Q96fR8)+ayp-mm_fviYcPc6NF8;De7a z(OX~ro!|eB-|(Wy;LayU%dw~e{J>xSE62}0^ZGCUo9X^XPkip$r~W5@Y4Oa9I_%#0 z)nB&#kT9aw)6t#@u)AE+Qnby&NP-?ousv8m;jN8S%vzpE$YIpFg|=#MGr> zn5I!z%P#fZxSevJ%zblFOk%a}@vr`L#N-ExJw;kJ}m$%cIPUo6X=u z$yrEvznN5Gb=-%?urCm}=)2WPKU|I#yj%7U?_a9fqNDZc!p-YO(^AIWG(x?8bN$Ir z-hTBPce^g-oW`k+(d>$O`5t)^Gz$JT3dBM zny);e#hX$K0LnDYxAq7WVn9`sM2MtnZj~sjntO0+p-+L>vISeteVy;ENX_)@7A-q} zmTf>-@urZSrb0w1OD$GP1qAcS-2pf;6QEY*#1T=Z=GKKUFOwnwGnUCxpUPMx0W$=6 zt?o81mpwu-V<~FxeV5!^t4U%oufZU-jSjx+vz4gNLH(&nDwWA|hua}ZC1fQKfyg1u-ea^WLqPm-oPL}3y`EcJald5hn z#sEJ$=~W}b!(!N$GM3fJ^7Q7iObUBktb3b`0^DqSIb6SS+%Hqvm!X#B$*PWu5R#-{ zr0{SH!Vs3lQ3nB5;qqd-IGgT&ym|0obMNl<;(WL~-|ctPG%6wqkq8S4Gdp?PNF$T! zoX5k2ZNZ2!)5EPI?aGGN*jo2MnnfuPQMI--(iYQc7J*KP*0joVy^kV7tx5=zxOHx{ zY(pe!b<{*;sz7Ag{DIW+lufNAuee!5sLb5DFIonJX*8I2sJsJ0;yHvoe2zv$2)ugS zX`JxT>NT%BEC8axTeA`oNZdkT8(uY=&G7(uQ1iEFn6_POiSW_7-kKrXW&+*;u$_m4 zUcZ@xkh}r%D((+yca!L`70_L-+OEN7xR+nG==DoM>ZGZZ+w|@B3 zcaB%AQxJliYBf$2(adMssQ13lwOA4{n>z<`mmf zK*ClnJW}H3MC7IgnyPuL+K#SIS}f(%%AXG^uV6+~Ct`r8rM5_ctF8)Wk;HBuBH$s6 z{UTL>ue^Ew3txHb58k`1jw$EX>~VNG@G$FRdmolkMN<1%k<7d}5w$dE_t@I2e1|Lwp2)^GjBwNHKK z_K*LWYoGZ6zxVc+fA+ul`0Y2Ix^oA1o8yyy_woJT_y_;kr)hDNpZ?*`u5Vsj+<97S z;k>&3!t=by*bB(vo}6mNE*)1r_FhO>dx^Kw{uSMM7kpOJQ z(%-pr`$zx6$)|o0#!X%>Y0;g(@%yj-!auwFo4>v6rC+6K@^Clx+%aJ!!Q5rl8UUMZ zAqb?9p32ttW2Gdy!>5lEU#iWia}W`YsRf6WQ_+IROc>B4r{3IJO>T#Xk_ZpZvcB(- z=36PXtP+CuF7og)RP)wT(JCJ3u)d7k3AF|R;BhR>0x_#pi3q|-XexERUY21}5Ay&I z0wF@;`6ewgYkOM42{X6dnwv={s_JvbMXXj!oIjWh0p<=&mlvDWdQF5Ft&L>9m0EZp z7S-ENoSxiV4dd9Zx7C!0axaufO}kZccTU_b5{ncym?o|576&XsY=KawQdH~UEbO5P zWOdX_5>@T`Y!MDlOcb==j#?EEfI>)WwLWL*$agV~6$q|f>oK9Z?}veTnR?EBSEr)t zwJHXto&hj*DP`Vo230dP76A$f?-q%Z48sT*%!G`kR7ujUl4Q=2fkL%jyS`ekyJ@Or ztTww#?P{%^GS^}vvREcppT@FW_qCL6(YJezyIxhKyStg22MakEvkd#O>$0lBoZIbj z5GSNAAwbT#jwOji%s1x7NwaXMArhx>ivaJs{77%0L5Y$`ElR{;D#ER2Mzu;3;%2l( z5s7H>%ckb9uE9);J~xgrWpVciZ;7JBpblofSR_C&3vloI)V9`yOhGV=m0K$Up&Bq@(_6Q6-NuY^bEicRp(C1wbV5WCj7X*ygyum)VCpd2 zG*fCtlXFcH5w`6U2@+woaCfE_r#thg%w!g-UP?j6w7^@p*H1sadg0}3x1U(we(G8$ z5>cjNyUng&Ij1~MWh#1d=SWAp|It~OBrlJ0m)6H!w@LwF6(hpIV+;|J#5pmi?BO

=> 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

VZ`ZF17Y3zp_VG7tuK`&eIZ!7x(IHYN)axY z-jB5k37RVa^d3?uz@-Yf7sh%jz~lh#y%Z6^-nPS`h>)8G%BRPzFxJ8hh{RQhfmlE* zWqk3|rCGqTl%AEu6-Pk(J~vce=k)A>sY({Xgu5u zGCq?sA}0c(_s&Qp0vM(pgm>WqA_4|tX5ELHv5={<10p+EJqRy_Jh(DYnuC<{yPVxtT z`n})#z3=?mKYjW5`04L{_%q`2@a7@jUGHBkhhsHYQ?nJfZ6%J=%cU-|UHa3fjfEaw z-@p6n(XZXi9$qX6Hy5Gfp+F>71Qre$9#I!Di*@ZpERoxmKiBjF|4g)B-P{&Pl$j4BBVed##ozziJ5!X zq>4!yzDa%~eh{FiI2gyIjzoZ%Q!tylXBL4-$IN8*j(JI5{IoDiE8wjDXZ3}I6chkB z>qy|jX~UX?tBAA!n3%oKP`1b*1sF{Q&`w!_ls?WLX{5Chk<+aN zjNOfx~R8P_&)T(FxW!R}B5vt|Py9}1ISF{mYj#6JzhX7Mzs z9|3?qsVlIf&*Me2N==v^r+?^ZP{;Q^@b{d-!VT}$o0v_`c;#f~WLFh=*g4FRU!V0Am1}3&IstkX(ZV}m}4|^6Xw__b(8J0_mGypzY*(o zd$>OWKyNBSnHh4i_!RzGmDXEdd##KVA3r{w&sQ_#%B~@WdUx&Sg#uu`^wS-O#|v_B zvkpY`XmIUtFb9WnI$l=`a0{ov_1bHZ!@>Yz4r@yQ7+AP25)Q4qnYT?5VL7sP?5!V; zLLRDicfVZD8&+|Hw(6@_2i-=y;vT(e@5WqvQx{+A@p^4;b~x3`r30cAWQ1)sBq{}$ zx?Hbo5pI{}0LMkb?EKX3Umh>lR)kAsQwR5YsN33)_oZF6U+wP2;uZ`R;p^4R+; z^=jH&Dp@yEKc4D`57&+1geAJ3?u3}y*^VcHi1Sk`MYg7{0Rh&dnco#TKw!kO6ub79 z5~T_|!oq>@?qVy_HR7?;-+jU#1^v9?#qerjNb2N>9zcu~Sc?F;Fd;!DL|~#DzcUNC z-0~rSW@ZI5XQn3;f#Y}(=B>DGP0fn1nxi`l!DNX@kuZaRESf{X-AX!?Zw-;29-or8 zAceEuMWWu+$V=gYpQ(9-l;UP#u$*f6@X!JW3n##tPdp;P)8_;L+GM6y^wKB5I}-`QzI(1xOqx85s(nfqPa5RAsah2DA1cG)#CBP<@(eXk;|tRp823I z3%AVz0@Th=R|0HZA!1od-&BeaVP93!B(bR!CO{N2_4DJk6wduOc}j%j=3#+=Sz(Bf z>R|FDgt8CYiAb9U#t20cQgsBE!o8cvs*;kv>A4?lEc54pJr67m}W^5Ot~AJv?nRp*P*Th|denhipvHBGK50nl5QB1pJxt;~pzk?=K= ztx(MYER%OLY&flfX=WAUjEo2mi;<0!7vC+wgM}hod)o9lLUQ71hnZ9U3&Xs`%_2RK zQZuWn2tdL+`#-T^8p8x9LhYTHN|D|)d|bCA0_Cz(mkIzWK2BUu)gtrJ0n9Sh2LUl} zm@LvUPME#DO_gK$v70q$%rT^K32!u$z1SV4*696wRG~hPFyCn0fe4UZTQQ63ah(Tn4nl-?1m9!)!RCPs2p4r_ zT1s`*>$+Z>3ZpO!!Qmjxa$UF6{b5_x)Cuu$D5~xO>)MdTO%H`xm<5+gIV&cLPgUl0X&5%G?5P_L2z&vVYVXuec=GSezZq}RELWhb^ z=dBig`D%%9L3c+t>T5sUEzBrF0LYch;PI)s#qlV0;kE(<*878pErp~?E^J(>2>TMH z7H!Q{Pj^K!#pb{cAxuIcg*+h4PIp2?pB_6Sa79@Jn*(#RV1VT)$D^z(2g-*}+p#iW zpjmH5fP_E*w)Iz4oZ)Eh?hHXlCuYBsCx>?}0C_|H$;bG|t3Ls~-|7m~5uN#Qbt6QG zMHmDyLNG+qCl`oOC_KQ^7a!To!!aGO0K&}&lIJ(0ab{*FO-5WeXAS_9Tl8+*wz(T& zdUrsw=Tk73gZNTPGU$>3ipb%fYf3ssn_EtqiMUpw;hyeW^R$s>rZ5KxW|l<|AT6^> zS#r_uO-m7C1OV-tLxX&@MM$;RTHPIq41nA*dA)@L*wk{44<4n~+q~O6h*ecYh%?|! zxrm3ejOLs&E|gHa)>>G&H)WyTEIHgTyiLcd=pIFo2?28cK&}cHZQIh5Bv(r$1ak;* zPi6uF;MN+atvI zRfveqE*kh!^aPotr=hY zi`OR%IbXNBl>35*hkE|BZELHQPWOB|((!Qez)w%x|NQ4){inbD>cfY|K!>IB@EZZ| z4v^0GMubuXL8VGtHQ^lE5g)>gE>4Jtr`$6FSQyQTxT}Uc7j|_PVqxo6my&x``t#%l zWTwoVw=pdxB2?{gti$`()BX}u>MA5Ob{{9^)`uD)<>?v4y(}eb*{R(edp{wv5FogE zKFdVJ0x>z|`yP$yG0zO>$*w^Hbc`%F(~pbE)ap{)-PAJAQmW*pOoZ;h!WKFP-~nNt zbG#Y+8iar>=~J0PVK-A#H_y32s_#<6g9t$s5v2;iNXufO+|x7VU@xwch?SsqA1Q3Z zG8Hi0HkoKxW_yIG(&Tl}&X5UbVM2t#tchU*FcZPO_gR%;j(>aagftd0CKwEv#Mf`f zHU=FzjzDxz>>p@<72&`xnMOfxqcYhi445+C!D&E;kstxNe*|V>koQq?RG1;Nr2}&O z2uzFt9%&}(2*4wAV9cko#Ttx-8Lykmdw#Jz+JRe_-Ik`klbe&E5f9I-~JY1)~?wd-3rmYzJ;5% zb|^pRLp5w7Z&?2LW7q-obk^BR^N{(?jhhwc>qdpQ7kcw&*1L0TG0tcI+#IY--SGs= z^C0%>e^lG?3x6_eaX|Plf3khr&tWDr!>qIi2A>x(=C5RLG;!}+CzoftpWbcmkzL($ zBcq*!G;fR9tmJ{tR&D2X-Trd6e)H?ha@s6Xo9^zDh&E_vIIw@8XA%2FCZaT!!c5=; z1OQhbXo1h20OoxWSqb80_gWz97P>aBzt1YZGWhKsEK*U8K)? zS`Pt;d1615q#+-vez`e$l1c&bUGpci7nK0en=)r<5)b!x$5VMaw~vo&FcL;<){Ra= z>!m&1m(S1+09WS#TnV2HUUwxyL^xDA97^&;5tCn0&QBX79*$*QRl8YWta>_?>(#&` zgMK2Ih`@Zk_WS!qx86H02bLtoKMoe`n{koO=<+}FceYu?5Wo>m4WVE#dAcS*) zX2AsF{B#~xlIN%P^5p^4uOGL&QrhO=aS-lL+u^{k4?=-m`*J4^R2TWw@h3`eFYw6p zvBBB#y~#(%cUKA~AbM(gZpe&8SPQE-tKNbVhD`k@K{8Bc5O;n2H^NW$k*xpymN03{Z1d0Mf+Z~e3H z{EL72-9Pw~@0=g6fBS7P5W&m&tZLgDeTznhNayqQ^07cMNG*kPIn{0+n40yr^?E4okQ2+c^|aY> z2QC;M+JhMrpjEYDT-!%tt9DCfX4cK=9Az4AsX)~T=v_-m!Go6yMATZxBv6@qM6ET< zJv{Z&rId&;^#D{g$<)Him>3@cKt@@Q-C5Nvr)=)q)`pQ~S4t)c;Hb9Tv_q-Vdt~Bl zW@x1T)y#+YM$W@qunxxduzn3Q^KCpJRH%pVUbkpnSqRKh zv6KF3S+Nb{@4zHKxJ5F8BD~gOc4G~M!#E)rUlwG@Ot*;P<$CfPNN%|LxULB zIhfRgL^sl!Y*bqL_$M3?>DHRVpy{y-0j^FmU4RfxJ)h9LEg~YzIMv9`NNwadyQkZK zxVbQU%8_SvltbV_%7}5kkvRa6`$@zAOfe=wD}Q}gw#!M*p1d|kVD~6MhGBRXmVH`sX?H-h@i?~&oqcWc?^tc_{ z3^>C%a{$oN@Fx+b@{Bqw%q$qZ)5Th&Rvv`Hy_{K91PWX2Msociy)% zy$Oy-2Qs1b@zFHJ5`M$=oqu6c7OBL}yC?@w^Xes{=7_j!2KKILJkof>-IKq1^8~xm zcp?}20q^hM#W<6Z@Rhf9wvPy737FqM&TBRAw8R3(04^v~y>di|063B(0dXYkq^AS{ zAgLNa5DNk#L+)ozuo_(fj$;#IWCFrttzUledO6fm&duZLvN4j8I}w1_MHKLWa9{YE zws#)yfq%6w{kk&Y@mLANg&=?s4~M$7R)m?632Ws{luQru4YeMtFdBk+teav&WrU>= zvTU0|3j{2+Y)ub^52qyuyQUH9r~Bpnv{KOFAX{stNM1T&*jhu9$Hy&0h);_kL8-j0 z?bC-nDO?s&Egp2an)i+r zr@Q5PZoJgq%^kX#JKWzb$W)H?(_^DTrIx326N2MGj#aixD~QKR%b}bfR~A|d3Sl|c z1px&KLfs!uyef!*-_=h*?>Aque5>^M0X}W`1pG~>4@Rq%5KNysb1g#7jsS&uInwmU zOd=@)qK)hl?5d?m;K)%TVPtY0+E&OsdBl+|AIWM1M05yZ44XGA5kL&r4n`IVfb;p9 zv0RwGCHW9BC6HOFFjIJXcn_;-7Sfg}(~uNo+%XRKEP0c6R}ZCktxHA39J|AaA_6lP zlp)Ve>90qr6|^&mnWnLch-fGwE{AI75nf8!)+WR7JIuW>Z|j!eG!p|4ZJY?N>sFVd z-E!_H!fors>}Evda|cTA6vPmb)D}mCnz=g|EVZ`Qb89CgL>g2CkoB@9X2(Q;KujEC zs!T-0?g46w6MMT}HX=;)5dx%e5hkWZ>hZMX8M#MU#NC;Qg@_0|n8-PZ#InY85aJx` ztM{^$)>K#kfQY031QcPK8HGfcl2d??(FYn%rx&n5;>7texBlSEfAL>^|9Ai3%k}Z;tDnC6@L}Cr5b`hm>I=K-*Ka>v zFWcSm`0@SIi&v*hiRG~L&CZWK5g0Da2F2`)@4U7KpFYNa{Ij3^#h<@@`_+?>EK<|p zb*#5c6-%}v%#?PPstU&)h43;WzK*Y0JYz znVMV*OA&w^Dg%${kis;Z&q&?ivGZc4l;@-yhw?HjITo&UakI=806^7Fj0n=3N-0QW z)?m_9^0#U&9_gQfi0mWKCZl$5nocBgHzGzrBJABu9U194)866JMAOomGe>;Abt!4_ znKKM@4`O0wH`ffF17u08K#4|E3$rM5dngqZ?Bc+bS*5xj*tIK*Up4Ry!h@L(=Y z1Ozaglwz2k10tlu0VRSTIamln%y5;wX_N9a9&qc ztXPIxGS$qxXFBb^pD8xU7jD7Y@s!?IWENZhA$xN8~hznC7(3FhAY+!Q2v(PyCXjpVfVYXjw;h<~2Y zP%PZqub902{e`ekc79>_fCvFT2s68qVK+j8{oHQD1ALC|-$VubxQb@N*O(mOU@(tg zgB|RTeT~RVw_h0_wppoj8uin#CLDSiW2Ri4f9bnl{^oE0hMPeEi~RLp{mt92-;EAr zm^P%mCY`n-PrxA=emL}nv(Pv2sYHQ2vCm_SbdsZ(-{WviL5Q0yVQNjxThmfY?(5c# znBBbt8PK+F%dx0hHz&pyuO60q+P41c&8w~1#}7}k6f}A~w}<-z2-mZEp#>-#oNL#A zyyEYl+%@FLNoEDWwkZoSr*VgKt!=YBFD5L)>$OF|y0vgAg<3OkIGoD5_UpMFkCFpQ zW?U+Bq4T+`1r@rU+uhv~9?s<5?oKstn{aSZJsgv248V9eR3O-{y=}_Ek}gJofVi#NEwr_zQay?`+tyA* zeeDQ%IPi6|X5ItWt0vrHW@ugjmLk?vO*!Fub&>f0_y?K$X`9R>#}_F zWEYf=-CE#PaV7e&fg<%_VDbzOB9KDJK^PSQ5zKj?EX9~RArYEKB36J1?p(NcB_xN) z;J85*=tGZ~2I1L^g@?_DEAc;fuOK5;1EFnN7fFYQT!LHc*L95mA`(f?Xe2o$%}-R* zGKCYBOt=1#+DoZQ=VYZLLf?8)Tw-wZBICDmG3iYcQZ;iyDn(2kBBU~cYw~USa0hn_ z7DT{Im`dI!0w8hD2UHax2)Qm50U($d!=ty3JkYpp+XAAsPLQ_c*1IK)9qx<>m`6ns z-n-=hq(VW&u9_LH=(w(JECN$1*PBU^9X4_^7SitFAccB!H}9ZQBzi}{y3}w>{4Y)V z2*DlOro!B=dbqDlop_pt6rzzbP~H4~^QAO6WN{q7%qd40Nk^RsV=QI%Zz;Z?O}kKbG(tOtC2cU_MrRqCB=n{Mar z<(s=Z^$*`XJ-*-S7st=PylYR#w_gCsKsLXvfAJr``Rl*>>g%sBicyLRKsW(Eo}5Ph|=cMO|aL~?aRG}9cd zA)=cFfSM(m@q zf_o$qKMguT)!aik9||HwAnZ+ssYCA0`tC&t`iv+ZZ0-mSGJ%!ycAE_&S{qSo4b zPgTYM@er680d*wcARwv^<6zZ+{X@XmD7*1^xKO*M^H^^^QT$7(OLi22MilV^6yboR{7EoH%p ztHuoO9WFYlT7k$>8^EoE^@-k+WN6oo2LU*e2XcCxH;;!8jf#8Bc&umCnh}1ABUNCO zb2ik#m{_m71CAKSz1D&N3+KI_o&a#te)h^XX6Ed`=K<1sB26|4VRVNG0AY!Dj5GuE zX;A>Xz!l~t*nf60>L@p#TMXgerOZNoI$Q3={KV36c)mY-&%J<00DPVV95)}HxPkcl z7-5w4FtPb(75V1*Kdb%`}J9`-zwqpe$S3??=)_w1J5{2FnCdW@01;B(Co&> zFO51o_H)@kK4wRija0Ij<~4wMxt?9g!RZ^7k9ViP``f?E#~4yH z3FG{I)a!`TX*4@sHDzWR3Iv>P0g)%1L&JSSlE;TYd#4#OGQ}n(HzyU8j~q;t2oZ#t z5t#ji#=;%K5s;$RayV7&LhP?!J-qwy;kqglpl~zr-kI^P;DZ4Nngt@fUCkeGS=b33 zGBP5Lchx-HhUwAP`cg_>UU%5mc6Wb_t#9X63I!k&@q$cH3k9GVY+Gl-!?9d08!<5h zA#6>{p{O}AUe+FlQeY|6S`;B+l0wW&I!**K3+8%l9^v}p^_}+Cuj`8!ClL(m9<+9= z2LX(7D3_<^$leVwxN<4=>C;*Y9#3KpwMbWJy(2)Wg&7SUiAo_*qfC~u03h285hUVt zWa}u1d|v?clNyz}dU)aYhvgrQKA3GT-<;`NlaJju#7nDNL^sC5YJh-@D3!f9238~* zmXYb1HB2FQeyX_>Au{F;jf?>h7(mHJGe8JWjW4DSECDFQK&C`cfXD%LQ=rUzL4a7Q z6v6vikB9Q@$7?eyB4&xZTW&K6NM})#ba5n#=|7#FITH3}r4)z(FCk)(gCSy+k{L;! zj9x@!q1;(BKy)7>V&X|6rb>i$5k!Ir7K|A13^Otli}cphRVL4G_p^8RWvLKgW?dB# zFem!~FuXS+B1pKmwk*qlA;!9flh}L3BECynqO5tv!9aA>zZ!Q(@-lFCOZ5zxV3lbi8iflyqN-fOJ!l!V#F>mqmyWP1Vy`a>QDPh$Jy15)RI9h)2j~-kF1* z8W9j8oQrc-uE~YSEL+4#Zz3r|qaq>0NWjWagl- zW~CG^tX)O8cSisg0R$<;!l4c+v@lN~Jb|!)VG~J=rq0an#>l{&K7quT{ZFlu#V#|e z84;yWyPHBvDO4p5aB_8uNTOr6o&Ym*riEw#q@!!Tz>{1$f)@}5f1T4uex(1pr^8jQ zM$Gw$K{5jY0aK!sZ$g+F44+Pv69?RPZQAR=of`uYX@Z>N$8=BXY6y_aHVob}01^!L z@91;#u*bFHkxmd1#KT8*z}q}ZujC=K(5!qAF`Z7>-C&@la|uSwytC}(F2MJmJ;S&p6rZ~MSttmLKxbIO$8#je94!m&Bt z3?N4}JB#1p6puuCQn%4T)>=3mjm8#0bMkPjOvf+H3T-N7F(!cS`?zXW(ExzI-~#k~ zcrtqQNv4U3+~+quDMtgqp6%Me`}cR)-}5<&zt0NBfMB*du#eMX6yo!y%xOT}-t_sk z37Fr(9HBfzGSpn3BV6oe`cH3c25gJ2}T6eZury+8ZIa=)GUgS40d1Q{OMp7%BMk)5Fww zVVVjf5Yo6u5F^r?cDR%gVrH7s=)ZF-jR<3&>Ay4veA&n6Ff`29%W4m&81d|A>LA<{ zKbn6>WW8*MQ|)f+W|vDhh4s2F$K`l;cRU`>pFT?AwpoWb07k$9@etrmQHY5?ZN56! z&~3HJ$wLUx?%FKE%R#nP!{d0Y?ylXW@O4%5KnPPmZ+6n=VKmt$$oF4u;{ z=cmR61Hif?83b*YW@gJ$wr(ukwwA>hBL;eJu4*E@U940Bh--5S2vo2*-W|_R>lSdl zTRglsJuI|s`su@ZJQgH+y0miS>t1rbNQTOxsgCoeBfm zRhJPi6D-&q9$Q>dE+OBX?ZV}w!}%jVHeZQ9ZLtBanqe`7jOGJwV0Js?vMPhj7 zW-VP8>p=oQ)p8u)TaWNm@v50yPHY@8b4*9MVCLGl!F%Zgv!sgJjXDxj*Y4(0C2#M< znTSZ6GO-Buj;(bjmcrUJ$;Y*_TN-s!Yf415ifgDVgiDoeZHQE=5MtXj*V5h^;_!G0 z9axOJAycH)dLZI}KdmV`Sa%XY!nXAQsD<6!0NtZ5V%-6TE>Kms=u4FZHCyXQ)SH(g z9&YL+h=4gMO1DtJNN6%w>11*zbE)e%8gmcJ3`7X?%oZq>A#wo(8=;nvW`O6*MjXHM z2jBhu-~aMAfA_PtuJ3;SZ4eL_SLaG^fBtxXUq1ih;oF~|TetgDef{ML!0(Tps{Hha z-#&flhdU|v{P_0#>h;Sie1E+A^FRCQ-~5mN@Z*2{L`a+wPXqv<8i=qg^>W_KycFr1 zK>^IAImL_WQhB{>8RXKtig5BS#-2qG2DKK`%tv#nY~8tVPSBX859+^_!mYI&ie$*( zwss;&b_4_@%RfiqW*!8swOo1JBZGb^9AR+kh$xjarHZNNu90>+=HYJcUaKI0c1Iei zVG!VEB4TEl(P8R2758jFiA>E*vwSo)9xQ(lkzKr=zB1Z#RKji!1`tqdRkgM@DWa{1 zN2#SZg>3&KJX}=~k(g4tmXd>vIaBpeXQE{Gq}wKdyE!2b?A8N3eFZ!mVh{!$0lBbs z%O)zRGU->A{y90bs)y<}1|YpD^N8F^1A}m5q3j~EaWw-@F$1C$wpqjVZc;eh!^k7m z$zbZ3b*EZ36*T3AB4VZhksulogoC*akF1>DyPJ;-k|YqFc|nN_x&u<|R+xi+#_W^j znY!9>eWoj54C+oob1}YF$<;L?Af*Tc)E7!%9-b*7lb8f^H_FKpF%Et6PNCRm3qGWi zGzh3Tz~V`v$!l_>hD3UWd7=!@K6jLV`&1x%^?}vi>|t@HNm;rcl0XPOYhoLY>-ki9yG+Z8<^2RWzt`Ej;hY2!%xS>h;f-rCK7xg%N=lA0v@*YuoOL8)5@Pxx3?(=KBomHu zp_*BJd2>KO5G3?JiaA6~Q=5ay95qga3LzP)fOO^BVXcSSnj!-i z+-%#{%jx0ZK~LxF)>5-bOCpz~E3<8)sMfe1>i>VfXdogm|; z-qo3@t^H6$idgeXCJBTQ%Rd66M)xofRsgE1$fQU!@bI0+trh~PxLLpIsd^{tCA5cQ@+!`%hk ziKwf(yA+n`j!HP<8j#4kvv4x?k$@|skh!J*V=j`+D79!;n5M&7odYm2t2qGn>@gyc zK&P)ca|sU{*=G!S?=@p$Brvs7nTUH+fbiWtX6z9$7x=(LCC55MJo*P*+ZJHo`}NQM z<)424pZ(Ey*Yo4g-oA^V*DsGqfJ`sn9OzKCzBTi=KmYX2*XKa+SI5tO2?bR6N!o{_DSb|JVP^-~Geiz0>9?N$O2K!kQgVTuTy}oCrOT7!3jvC`li5 z!nSr(FICdFhlP9ZOpJ_K5;3!ZAp$Ytpt2wfGmnt?+!53)k$yl-YnRrP7!iSplkjP3 z5b3y22tI*TAS4#{))Rw=tX9pBr=@pQ)y!=ug;VL9>1nywU%SX21yC4~$Rhb#snZ>#uARs%5|?B6=FPPfvT1!U_Oj8b8|>eQevrt z2{P1%!x$&OU!$R67)2K`CRJ$+E)Zu9F#?Q8h=H-%B6?qm(-y4jGc|HgL;4wHw>2EdIHKSdC(cjFzZQ}v%6cD~NtS$HOr4uF5m1Y)Sl_WP1%c1ENDViMOJCa-RIiOddhesO>a z+C;=YP)@fZ?dle#u&JSsZpQ=OUiz;Ve?SNiSy)?qc=veZ`XcVXe*gIH-6w0?VJYio zL3qCC%U7kX-Ftgc4;A68=7dPW#uFcBA-op`uF)Xb0!%4Q))^k4{*l!dc~wFZW{0@0CXBTZG^>F1Saj1vU||yG zYd0!n$Y+g}_~Q83s1vP#pMc(O_yOg87j;wzWHe(Sh=}B-NOHCFyN5Bz9QPXp1m?0H z5bA~iENo_7E&Dbb36RO@cb~KA0f#W5gAT2jdxUk1Nj!^yQbmYPclA`to0q3IuTQUE zole59Umo7Py!-6c!=cdeP*8∈Iem5g@jvL2Mq|xw*wp-o5>^zx~=32#^U|?}&^5 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�P($t1$Q<)*PSW?DmB82pers|P4f~5!~ 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

ia>*cXOKl?e3 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

nfSWfXoS2)N9X)#V=#l^O-+%PW zU;WPR`>S93%Ejl-{oUXH)8ofa$vVqM>J#G<0ibEK0+hl#+q;{a8#y{_qB(Mml^8Lu z;IS#Q((sQo$jA3%szE99eUZMs+B5_8wDME-WmR<3$+x6HBAR<%y7whI@ z_T=_;VX;;>Mya|^*Skn+RK+n^?BOeZHsObhSYjT5S0jv;-V}X^tj|=PTFC?|ghm$I z29R^skcpEMR=xw13yujwnO7Cno&k?0@c!UJwCzEKmrfDFdagI8;?h~=L!nMpaB&KLkKe1ZfinS*{(P+_;_u>wZ~Duuyw?nqt$eL#Z0 zNB|}=SAgPUNI9orC^;vMUZ*yl>%QcAAv7boyaDTqYL-5Z(3 zx-0{D!#hiD4TYN~tN9M8pt{SGMnGPMq4qPj07=7cSgZ@OszgIB3xGA+Ua&Wvz`pC- z*{tt-b4d@D4A~nL03n%=4Mq;ikh+KvC9lnmx>6&{6OjlvIjd+pYeiL+Q_ePTEq_r8 zqmtErFncW{22W@Nu#gVDI4x`S8$^Im;`6!5fRIuKRWZLyfE2rzgqaV5`2t%@V2>ZH zrX{5W;IXKcc-pfD06@(-i}lfK61xMJ72sN5SV$>F!UPeKD7FJcwdUE;_t%1UJG%np zlt3MS8zW%Nr!0a`3FrL2`A4Vpf3>s zpc=IeNQi=EGtyE+_zX)nJorPUR87DE3J$uh)2Em-Or+>k^utUv_By%4^ z%sHWVWhO3c1uBS`GpYLas@4PEijEwIK|*hHX3W31a~)ftLWtI;!PJiCKwX7%MzbMe z&ek5=F|l1RRy^xWx`UTUq51D?Q(Xf-meg_#7T_BKjIc0x$mA$V)aU>d6_b8}ukkJq z4t5%d=-APt0Jyieck1+sKm6f$i4vCqkwkRXw#>{T^Vxhho5A)DR$%HU0syZ7gxHJ; zy>WZpodXK`*gz1~@te34jGIFQ(7=ZiHTdtLY8bKZ{@=K48!9Yx5Ti)8p<+FIpgteH z5qaXIkigCxpjvf;fdiO9b@%~*=x`;|4@_zRY9yo;Y1=U+0EQnYSX{?!x-S42!zl;a zP@}QmI}P{~&~e_3px2+0$KGFpgW4Q#A|`@rT&K_TeO^E{2F1{V)#%W^ONgc|_Dacp*X9>{ z{`B!b|Brum{KV0|?^dh6ABH1GkJ^2voWAnKFTD7|#ogWAAOHC8px&Tj9T{iqi*4Ad zit1%p03ql!YJki)01+b3~Xf!qCJ8D1kd5n$9Ns| z+jLJ1f0Se#q?d$xQ31!Z1!nV;5fck>l$}|(6b_$$nzXMnrG!y#xv~DEl2S5C%hn1J zTg1$R$XkTCEJ{ICP%scYQX*w#l~lX!nykoe6FjTV%o_gCYWe~7K06ZKd5kJ%Z#D_e zlM(iPX_~Am%0BoNPpgh`jtx7Q7r*KEtwIjbVtN%Fcu0vvB?ccck&2dLZbfXs2+a<% z6bosLg=2TaaAl5&45dU&2t+8XrjkccE?%@$#P1RXc$WJfpV%6yhoV0&!(DP52IC07z$(Y zmaBzxlZU=n(43N3DQ)4wqTj-RVBou`JNZCS_iQc25JSy82v-MEte8VR;iaaGN3D86 z01&h0ZxF)+oqN&Tq@gbW*6vyW)Cx{4AVhcn5JVhGY1?M#2S79rBD8q|V4gEWDOg!h zwWfGH^h47$!%$STX{`5f%J#ev2*IARSrayGQ~H52Sw1age_kreAfQ_Mf>D$r3S zVTCC*N(Z$v**e+!esINwf(kIOZ+L~3(8bnXvk?mTM9e%$Y1+o}A@+0>)RZvRz$92e zw2r*CCIqkS2@`vJ485_rb*WO$Whh0x4Hkg=^N3iagm#@^P0&;FR0^vLy;L#TS5lLc zWjSo@tCk%=2KQ9;W_cDhxb8)*&Pw{e&pC4uRk1jMkO;vnU#rKl^zl zjw7vSMG;k6;}0>mV(_|Cj9%0ZzAXBoWo8Cn?kw;T z@0m@uFIzSh5v&(4nlF~Hp+jHyl+kMsvTaz_Qo}wYEV;=LzEYw9B$W=cHQkXq_(lle zU2e$e1~UkXbj_oKU5d(&XejOR8lpUVID&O+t@gJ1LM=W`|zF;8)aa zOrS2rO!n$QU$Yd3!Yayady58h4&_8a6N6SB5xkB_OtG3J`d2kTSWN+L;7E@S|_2&2+uK&IRuGVEkyrz^;E-x(X^0pA z0qXVmA;;bVj@4rv{TYs-U_e-yJYc`CF`le50C6%iY79paNyRLg#8CAw)6t0A@ke9F z^%vHSXl%?6t}nj-{qG$-viZri&wlsTJ1<|ka^m>O_4PG-rE^Yu%iSkWpPf5+!^IYOP}VT}86!_A0l46fC9%sv@! zvVv;$$BD;;HT1;zpG0HACvYlP9P{40LlqeZBMF`p1iIa z>kHX9JByUaxLyEIa~}sVpKn`?Anq=dtN=9wL&${@&`>*8OKC7j?e6l%q2`<;EJcR` z(fX>EE1-JkRO<$Sh)9ayw&-?Dj|N3jN==h&5N*O(QUcJsV)>h8wH8&>Wu2SR&^SWq zXw}pFhyW=k^Nq1L)ol1c7&F;ZHqch>Q`CD5d9j4k{N#R)79G_&X55m9rbML-HcKp6 zve3`o6e80j0TMW@RsipPEA{$)$wVMR^L0Tl)lgLhvJw#jRmvubCS{MKM6Ghv1PNNF zhuh0o+!$5nfM9$l09zBHY`r7M>$6?BY~Eu;M3|IdvUt^+4bP9EDgY(QIoVSak=(Yz zk~5V-<9&3Iw`JtX8)A@EYGP1i7NNyTi$vC%ib^RdC-dqxn=FGGh=_z@SXLASQYN)M z6Ma4p!;r|6nZ_Vku)%Det={$_*=SqlLo_^j&4XAh0>S86i(VT;A|{n&1Zd~28I0C& z$=Wu>D@jOT6}rydLZv>zdtbP+oKyy12a<`kDjZP-Z~TmuYJ)IzzcTCfW|onIJztw) zbt?qI1f;4d=Q0eGNGla)X%QkK0YJ7+%;*U#V-}pjvBLD)8=JM319_^pw#POleS}`7 ztHCNZLqG*@fS^#yU}XUI_Mvs-0v$ZpM}eT+m=&T!Fh#>VaG!$_b&&NAR|LS^Bpr3d z{wmuu^@WhoB+Uq5wc|GIQOj#~EuJOi;(l3_yw{Ghn*Jxpngiy#1A-JzuaT@aaZ7Tt z#@mcwt?!(`CR=el3xNa^t{2eIs;gDWr*RN#2pE+o)@RK$SN0T!ejrM&!U!y(FtyH6>A zFe8Doq}*)n>I-{7;n5wa9s~nV!iWa_ z=3zg!sgNKZ$B5b?Frj0-I#&@PTxuw|WdHo+0>+!NqmMuP=dkLCj4KTvMaPacT2X(_ z7(A?B_&zTqs25OmD`OxCptTPGMnC~EMx#!?;^F;qM!gEC-$e|y_;{-@RTkMDOs~&A z6ET2Auo!6$51WH=pB&S##P&`arClQ|M<1=Rwes%`4eXEkYQQnxk-y9yr5V*~!yREs zod%OL+g~REmw%x~-a0-NM0nxy#WSZ*K6&!=AO7KA?%jKI?(`{9NvXjI?+`$QGf~Vc za0ysMEcJqgm5Zi?Jk;)kmVOdctdTd?1dJ0r`*Jm=y8tT>u)tnNOs_6j#8{f+#t_&* zCjcR`h}lMpbqlXSGq`jF>T!H@{QWi+yD7F2K@{A3(PXIrj-H$24qx{RaRUcvXK-F+Lc>^Qz z*WDgyZ4-lL1!Fsh7_Dd&apm4jyW*K;i_px?lg!;nJojZWiZvrcmloJw6CISCYBGFp z@I9h3r~0H=%Lq|XR-^Kb=P?Exos9YMprX8O`~eM z8jr|5M?n~p054Gm#4^}zLb%H#vnVn~1x0e_AB&4n4Z;8bKq=fbR!+^Ll2Q^@2Aiu; zxHLH%Bb##qMQh(jfj=IFSkh(lkRCWFGz4+>&mZ*n%ZiQ#55$3y}`8U}BY;DgL2zSrC&P&MK^CTjq!2n4{&u|;`hi;Z^9nTy)h zGIPSj)FnvSy z3Tai~;#T5!;@cJwa z3P5URJN6P)iyjUKWM;AYB@q$UYSV zZ2ivNI8_{D*dEG7pe`eh7A)p>O2WcbdtoA-F2*s{Dq${cZVqms1a>>N<#|k;$bF5B zelpt#+xl45C5s%Iw8*g_m~_tD_KCG8bHk=dVS~q)RyyGI5{{%TCs}cVs;bo+h@(gr z%Qje94&)5HS=vZ|i!igb#jq6m?(QA|4qf^8U;gsO&D*M4ND&%s%}!7(13!fF2x2B^ad@W$`@4{>~F-|8`@A&rJ7XFdF+%)^n# z1OfVm?5hEQh+j3d`!#kMKNA7ch_fMj4@ATj_X>3|r;h>mYosdUE)$qeh>D6HF*}P6 zQT$qYvKlRn5uS@%U~)A&o*JBebkYPp^7Ch0C!$B0@g?+pNL)WoeozQ0WGpE-iLzoo zMRbTbongAZm|eJdp=t7?dyk)(#6Kk>YTIn<_`J>Yc{`gomE;4QP$W@N0044#Sn~D<^H5k+IzEw|oL+FXUuJ`u_QB^&S8&QzG0nTo^1QP+=00BTreEi9@ zhYAsS8@RRe*w|Zm;Gq}R`9oe6q@v!#72QQ1RUwM2s*kvR1p!SqFJZ>7?#7JZ2|KWt zB_(2YLr;HJIA-Tj8F4nTqxGZDNO5G+>%#uI>>Awtf{;3=qv7pl!_H%yGs!ho(PoozVnU30^E z&tE$Yn7rkUI87^(64`GclukbX$tfXj0A8PkynljV-gWrDN}CFP6+g_)wkvjg`@Qw}1uhi~Szgov)Q2NiWEQw1VK zA_IjKA`%5KRsAqT4LShd2rg8{ar*MY1#(8fd&v!5f>VzL>@?xC?@ zL2t=9m!hCrtg7B(Nh>2R+_afh0V3gGMmkaR9TG|faMvtbPAQop2{if}K=?pV=#hM5 zLXDL|DIt568bD0~s6uTlNY+FJts)sC*KPa@7j{_^xj%>P8eEvX6vbm;2p=cJ5Y<3U zN4Wb1jvn)5fu$+dY>#%gj0qC5mtEYMz_rK~ELDMP{iH2@o_qAYJ+@2R7Jd2DfCxB6 z(&(3ph>8@uaNwC}!8sx`-+sxKJq&;cMjQZuHQ#@h}xa zPmpefB_jewhnp2!*U`1e$1hVyZhjno2p-z6(a~0got0&GoDjdOH(rO< zdCAE@*ITXWMGq$GXz28Z$!EsVkJ!Z{jENpAc>3uWM9@$lUvT+;(3qwgx~LinO+zNH zca9N($-ww;Y7VGERQ2~tW0Vmlw=~JxM6BWWt~D#9^|Kyi$Gu0vLEIfyl#D)S;v+hp zX?|S_g*~s=&RQ$36|vG-10_0ZXKgzppslU#y}c!j0pb`&*dJ5xsfrq;HawP!o7G$n%-O(W2lJTGh+52<#*HZm5sdjjgs@~W z&5R9-h=PLshP<^9RDN2=`U(+IiAugwSeV&Si(A5p(fQtq%!+=+WJ~tA>_OD(IA6bz zDEv<$s0!!C0K=NYovBQBC5jcSld<&_cid*3hW)Qbi(24141+P{ z=6RKyT2yl&cdZG)d+wVNQ-FS5B33TgB{oAd$R#x>yUs1c2kHT zVp=02Qz9V>yTq#uML~ytFd2-eJDBZ#6^XZ_u-&62d~74P8@KGJt-S^Wg~ci~#Jf6V z5eb+J*;|wVD2Tm5qNa&g5j9sf7OSPPdn`qWD9kQFRm)(vrp(HP!InRnDo=3e2P@=A zL|m*3wVAD z##oh7L>xC;?}aGKaVK9j>!&D@^xSd;!w}c(VVJKHLY~@%!h(oHU&ss1!yb)eSCznj zw#Fhx9^MvJ@oa!aeTZTiZyN}K%5c}bM=jl!Xy$05Q)2@qJOIV_bq74L8VAm>X&mQ` zWkF**4E*5OL2dET0C2WL+f;PwC{W^1N*M+&%!9kt-MoE!>)AE{zWVZu&tJaa@kgM~ z_4UQtVjhUfuD=4fy0y8wEUv&2T4iAUmO_gkd$hmV73YpHDJmOBbZXR0E~4pz_|}%4W26Ggv#FoMD#Q2-4Sb~82X`+8V|h}j9-QrcZ+c$h8l6- zbBee&Xn@c=*jKR55A=(cNx0+V1#vG?kzG$wAJ+6YHpwRS89s=0vW!L9s?*^^hpaY4 z^&k8Q5HyCtyH(%cxOMlnS6{t+`O>8eXFvYrx@sW;Ek(Ex;FT-SA31Wc$@$Z3pAW_1 z%kRxDe~=9+=-%#<2oD}S*tFT78X>3)UMqh9-m%p(Esn4Qayp#VX{3v`P=>4!5Q81G z->WK`6$v?0n23ye~O_Oal5+yWh3KY!$8xa+m3t6v9 zO6GBCV3CVu?IjTjI4}YQ6J=V4T|^OGl#GbE$)K*mfOt=>6@lS4b5_CRZE-0lL&xBcny(&5wi`Nku57p?8-d zwET>bSXQK7#KZ=mnkdEo5pS;#tfiH8vDt_)0=BbuZ@c3nscNzTP$4B6T(O3+*9|I~ zFsW%8QISx90d(L21wpZGvxwRYBvFJdB2AO+RYDZX?$Mkgbzn6Hl!&7I6aef^x6%ty zNk|}?n+8B#=p6IM!g}XES*)x=RZ}L5Rfs?YMWksHB5I^->YJ`mR?Ag43@JC6lF7<7 z9-^-g!KWm*gJeI16;_H>s3%abo412-P{k_R_r>N?!f5|YgsNQ07KCausLN4Y$)4Wp#X}>=D!gEh=f+=m~*x@K{(Prwf&!hs+PVe03jL9 zqC`Xq8$tpdeFeN~sQUR>b1tH6A{KkI%q+tCC>um8-VckAsPs|IEI>q*&O-AqN-#A}nVatYDAxB-Q zJ$soFmty5i*8ial3;?;w8ZK>)xxxFnq33oG0Vq=`Y%x_Ni~RCz4x?p_EXifc7I#Co zR^=A=vZ(K{YHYV+N@U73!xhsN%qWR|7(AutorB#Of;}{K_Zy7bGf^d^x-rxxOIU-G z4pqI1iYDJ{)Ux^-IeA-gK!u2e0PIj;Yo`0Bx!J2%uc=QYagS6BO4T!mRWnn?0vL}N zYDSq{{)iPm#iECSgnc-{Q+Xy;0>G)Cy(35wsj4SR^!V}9_dfXW>tFryd_MdBcfWb$ z@WIco-{|`R1dbj(^4jaKG&%p>Km5z%C(kI3uU_(lmC+l)O<>kgzy~p3@geT}I7DcG zBNTJ!53mm*!o+w6syAbhBbAT$YYadiFN^xo>P1FGf`RVh^@56x9llNwEC$~_9t5Tb z9vvg?^E3+MQB|ql@z`5n1c#F?&9Aw_Y>B(G%L^BvxOedQ1}c5)nabY_1MFKN?6$q| ze|dVU<5K`Y(9ojUPPre<29U0?QT(q4XINqM1l-$SZDRv3UC`AAa=4>#w}<{KY^2^FRH! zpZxoQ0|&a*N|X;DK5*&cb6@+~m)ewX-@EtL+watYf`IIPI|$(Pp2;?Vg(a;0?M)LA zLU)Nlaz#CPtP+(3T8GicP$XuLc$x_!k10~e#C_bY>j=IyA}-ri>>gXN~pXy2+DEEiOF z84*E7>m!yMVpd@eDU>f=QUs8{^TXE(6$#`?k$?VYx|MoUk=uG!))A z*nabSuV5->LvJpSMA&yM3d^1D;lu44pFiljE>Skm766D&Nl;2@nrxK`2BB2hDs)Xi zPlSXx4F0jwmu8lwL`f20-win@<^q7ZZHB&g{xa%7K>Za#L>@RbR0gpaz`SspCa07U z0J0PCma7>`xp?{1+JUAhleQnc{W%YkGI`3#tO8sZgX%5$#)rs7)GLuJ^R6bj5tbsF zlDW_ZM6)gm!NiMOb$PC!?}wa|utv2HlNId7a>5EGxlSn=4{k}gp)a<$p>gNMJYHB8 za+5&7dJT(+0P?^uzxLeaE5|lAX8j8O_Q${6+3Iu3NWd(lmgNxFKUi9TH8sgp(e11; ze=RAZ;4U9$d{_X3ZJzDJ*79mV!VAGV@+~dNStLK>Yc`%!xl9Eq6b3!Ae zp)XcTU@=K43?=NgSaM^Aq)9{pqzX!f70Fh9)#CQV_O1~E67j$Qf(X`gnsVYIhWO30 z$smrfZ+G4;OEsrd3ai&qi0>30%(w@dg~6a|6q2y8iaCkd>VdXi3aC_zEhWMXWUH!G zoTJ;zDv-AT$7n-orQV)N4o@B~MZqnD4X+5RnI14JSmQ!f7M-9Ds%dQ_xd7BcPz@qe z#oH9vJEH6ypQ9D98VMd@POzW8;~^p@8^=(7swvA9P<8AGr0y$_0BFQ>L0}`)T^Ow- ziI7C~SHJn~Y(9JS<(JlGYv1_lS6_eq)uHPN)5gX|+cu??qeqWCe)7y9mIUb1kr^DZ zSw&*vM$98f8|y1Zgy}G*Vu^Yb1=rYAz8=O5fTPTM#z4{vj_5*kXSYV2Z{Sg$Xx!^gbB<9ZG|_LQ5)xb2a64dP8?pNkGunbah@sxuvG#1i3@jRRF7 zU9j_&fd-!n@!0))euW;H#k8Op?g%X+0tpqOIh2nh4G|&L3$!X&bVk5o-{dY3aeI5` zpZ?{ihYlS)aqQ@y{>dM$mfdo-I&%2%|Nfu;JtJF8OXG~VFB?jUhBD-oIUFh~w_zu-&Bo&~ zKs0G;*iD+)q?%nQs4cq^`cWj$dfTPiCnfwJZ2tgoiy;6@h5&$N1_;ciMm*<()&nag zKvd?GGlEON?X{I)5LL7kIdOdb^{<`lRdk?cmZTH_M9uf_JTgjHBdvsyoAR7>P~#MB zJI(uF0i;M#&Lh+8&)9BXy?>4Q{hLD2+Y|)P{|U~ zE9j@H9t$BEAPT^&#l;%&pv&cQD1+04?0pXug_5BJ9~==retfN2Qw35MObDO`vWaq{ z1}Qy$u>0$O|LErDj}wsb*0!SvSf7O2C&;P}-1M^)Z-8n9s-?m(QLNiQl+5?WMutVW zaLySBOtWF3O+O6M_lVH8t#z};T1TP)h$$y;U&TTQ*dzc1g~I&imtTDKD;Em(@BZe- zTfh3aO|8+EHhZi73IQ=q7(^f<(&Vd`1u%%#GnM*oz?2aUvI`Me@8P~LfTQAQ7>4W~ zh=Y;S6oogQ;RLBXhDo{YyG|cQ=M7OviBis`FDWHsWNirmGOe~(vkax2J9p%@H_q?u zZWHFsgR^H(S54!Kt*u&$ihz{7Ymzbui-P7h_x+&ee`2eWyD}jcBU3yGvo#7p&3D*4 z1;(zAswt;LM2(+ORHSIi#toZW!*J=PlVAAS3r9|@Hw~4(%QK=xiE!8(4jnl9!tmNKk^@F%V>n5|Q`x&9>g! z?YYBmB19oYlaN_iHh3{X6}aY+X(R7J4%Q$=(0f;?t^5fSASg)XBEba1^I2DhrkVNK-Oa8-B1la;i1eit zE)FPE0h0i%x(*3t+?N3mX7dFg0%0?sVNEyK3x%}3x2LKpWyjEfeP4d^)1TeDcmMLG zi${(en$H&Nhc<)t;bLh+0^yGsF>n zS%l-EX04aCM<5lsh3`;=M&o}+NNM;XK2RZaAixp*+dtd4Mzmc4PrMpIZ%)|v32YwG zaOJoIV}sw3|E2=n`rTkM=xl;|$6#e&T;h=i)QBpMtW_%#w^V~9d$y_`6+xi-ILH{-Oyb1}(2vs9ao{Fd zg@_ALL5=y26jcm+M2a;Gz{&O3-%hU_szp>CJ%Eotx%Q*K_?vHj?Td$w97-vtoHy1t zQl?V)+Vxw1{}2Cq{qtLhb*UWQMRrlu1>UYi-jne zCeYC~y5`UG6%aFWBDDlCwNDIyg~_4tA#(>3-zrqi!4fKCQLkS>JlEj(7)8O(Vl1_& z0J!_7?E&tKSA|%ho>yf~QL<@yc#Ks+Ma4?Kz(k+q^?Z)Dfyn)Kh)7D&U^OVLatu`? z0;*ZIk*I26M7N0qkmLz&D`*pY(>Xk(0nMGmW7=Yj4uCjTHfU1SN-k}uMDqg&dQN31 zD$o~}Qh-ppRq447V+sD=AB2jf2Mv+%z?6+yPe{mvn^-fmdB~_KK*SA0h){}vcMgJ- z&?N5$3yi9?Pa5xKfG@~tvfqd$11!5DYQCI4=f#?-xiXts%nZjhyJV%7&L3M$WoaL` za6wQ7BNRDSbOjvvvlcDW{ZyFm<~FHhlX0=AWPW z`rrP=udlv$ch*|;<2q_9z0OD z$O^r@N7XtHBj6wZ>*}Yb-OjHEF)7vvQN9h=j$Ku%?U( zQCSNxRJ&(FE})hS843~sf)w-Cvh@m5N~MTJslE%+ z?(JwqF*>3ovKi>vS|k)!_2tXDFAD;(3IJG6Np-YWGC87cl&aoX(EOSRVJIb0@-{N& zIhKf2g&EPPH*c<2EOJI*(S(Eu9J{rOVx%$k3 zp#VgL?XB&9`lo-Lwasd^Vo~ck$;|J(^ZvW_v_ z^C*C@{N}CS*#)e+RYg!p*mc8)AANG|+UJ`GHk+nx+otb^-M!tdt!WzYp1u*m(SmjM;M4)uns zf=Ur-5~cYl*KgIqtyMS>VZdY@LS_R1@q~OJFqm%`XAVu{RQnf-{wblAf_NS}UIPN? zhaX+Nb^F%wV@KB4);A9x0L5k3J$m%$;lszvy(Oh&@}W8r?Yxu807j<)LDzMgn;R)5 zf8zma_5&iew?7U&0V>BZ4kmiTfLJ?h1dP&i&L(y^RM14px`|mYdUpz{ft988A%16F zw|v-L)QIG*UPQ&jZqDtcB*Jy3sL^#1Rwbgs#l#^-XDT=~Ztzigd~c1uwZD~8(4;x& zBWaJ7JQPt1XA&^|E1TVT0str;NI1XcwiV(ekk_p`t*BzEp*s2MvoM1NvL~ma&F|ucXm)znTvNqCXk|-j7$ZI77Cu5@T(&+Iuig%y$@`1 zLqI}=oJ^dy-whpAHD_wq8Ze)6^6BetCl=Q+qv`KMmq7_r+fo7&=z6~X`Mu@t3W?e_ z9Y1m8#OWhSvc0``=-}EnfAI31n~#U3rceOe1TfI=bd${*OA!zfCE)?xA_>8op{OPz zbt-loF#t`j^(P=8L@vrI-}ugpXD%Ej!hin9k3PM6Z{9W@ffJ=fJr9KBJ-NYNL&WF= zf+<xnwyM>Y~92W0U$RC2`M=*k{XMYBDq0eZ!UzVmeo-Zk~JC=(W=}> zapLsn_8}!_hQg`c$d0;LnH&W$nf@N5lY>BBEv zIk>mC;z4Hf21tRm`gIxwfMyUIHf~0UfOXIV@4cYWKY<9vnFJW`f+aVJy%(OvIS8uO zi^K4`w@Wito4xriMmYd`w^Oh&B=`6al!Jg)OF|R{>ym0o_ z`Z`!k(ghW)!5k6goXg46&lc&#o!-`GJw$$x#^Q^b0-ToKf{r&Mk5X1GSNz{ZG*XgihziKLQU3{koeB&_ISO)=WC2suQ2diH5Bm@GO z&bb;h#dXG?V3x()}kMO zf)bTdUN#B{sAK1A0Pwp03i@rrh=}EKZ9uG8(Cl&|DUlE?rS5aU1+vkN*r;Da=cYNK z%A-4>SO>=mA!{lbntN+dLN=mCFpHQC9h7jq0Wej)ig-5P)BQ4$+kkPM9iv!3S@31lw2DnEU8JL9&|_hHJ^P*3bBl;IIL9HPicJxeHSnQgCy#O z;FZLj~_%DC^z7$9aRkWGsZ+`#fSHEyRCtR&on;WxZ$2YEj^4Pa$ z164po?!-mbL4sTqQ3gSPl(MDuazjI3C}GNpixPR;;Mkc^1vGg*3=fP=rkwlIZ$H~9 zyhf5sFCsuGi3guB^u_wM5s>MOtpY)ci`P}HwU4CaxjP3gEM`4qP*oLELaPBacN&aN znW|dl`(E3?;#-v4WGMntCTkAhs|O$grVL;$lM+!%mgG!CuEJ+uNUdodm{c!YArOXW zL`8rI6+wzw414`8CFG)JV_+0`J8N!Udvy2a&rFG4diG*vhbyK^_G?5p`#0wnXw1(( zfi=S-LQ!Xhl|x^r{zVfrkaHJk%M>P1%Z#{(l7`xrtRATpIefHz_02OZed)Ey&F*gZ z%YXg&llSkGK~tL$uoV9A{Rd40-~8??P19PTg=MqReCWp=wXSA{YAHBE6af{bY(1M1 zszicfG(1_0b;(tM)TA<)|Guq|)|mlq<@9Jal;76j#0VD=Ra9nCpz4`MM5QoK&W0 z5QyB?eDU2`e1C!f1B&VmC`$-U>#l@|uAL*Fy=rv{@m+gIL>QwxB-J*BQT1yN#R#B% zpv8Fc=uPfIRxj0)fbWnZfU&JUO0gZDT9PDo_8O6mbg<)NFO~E>f0jTB>m>@sRXpdKG5v!sIN8qYxlMB`f-|9a-ksY{nG zzW4t7ThF$0A`v-y?8vzb=We$ZLWT+uQP;PEZpNMjkQzFXb=nPE| z3n9A$2;&r}S~?G%w8q&A(J2Yd4C^&1s8sp=ve^~IM&2*!0JS*zjaQWHzgok3iMbZ2URRCCX zHoT1hz*@R)u*cW7O-iW@r3?kg^$aSSn?y*INkd7gD*Z6n2Gh0;B9<~(k62YmnR228 ziM($bT8l_PP_TZxN@1#PdVssG0ICAzl#l=t z0bnsauF_a5B`HH!+F6@1Q9=a*02VtA5fKZox)q|fYYhn~Fc*=YhrZv;jZ&r*+`pBs z)_MbPi4|T<0F;Ot$}?K5&)VE*JoM7>yT845`GsTa2iu_=@(ec*F4XHrNL5*jlp?H@ z6Cn_0v$qGaBsKTLprWaDL5>wnn_#`~SBjzvl#;T53CRi&z+!!oa}wd@YFWxKNRJs1 ziAx!}RhLn?%w`Q?vfN8b36rMii)YXS5mKVuCQK;ZFkj@^!gGw)-%7-FAV}!$>h?dd=0A*s8(nCWD0fy2SW)W?hHs@4^fyFES6@WWVi4ry5q!s}{2yy7k za>=TYGg;qmyFo5xwOkbzLTuZ%Y1_h`MU_A_^jx|jQ%aPP++7D7|n!hZlVrnil(2`S*W(|I-ieH@Th7gD*z{ zgrVnu{`+^=7HyO=0jTuDPzIrFI5Go(l`pI6AVmsWYcK?C=dB7Flhh4^W&aW-tKSG2 zFd#tFHiX#sorq#VaVMh4vic4q0$c_W0Zf<>XS3NL1q1Rj^K6mY8Ksnl0SjyCO0t6x ziuGg|JVLg;i2!qxAv{w3nX)T017$iENSTO|?Vgrru;YImKC#@Fbq+S1DwL9d*p>(AUSzhEp*=+qsM-hbK?dqo4P?3v`!Kt=sYpiYs z2%i4;{e^Tqmk(M!W4*$FnV})aktrVkXdr5YxS)|#bHuz)xdipR6)pRv)!$6$_Yt8^ zLLmEp{yp@s@oAkz3|LbS^=hFq@ff?rWZ?ZXb&S=@W+Pe(@whsUs?)CCOuYxcl&amY zVH8Z_m!LQcmlR1V7Zca~drE{ttDy zo1DM>^{-yMd|_+r>AO$2nC0-n%|HENWC*g2iA4(o04z<_m#UM>R&>U9EOSl?%Ml0MxH>F16eKC;#}G@Iwu-tzvPtxrFCz=I^y<+H3En1ACB zUTY9ji=TdY=jLY*F1~Q$qeev>HYT)sMt)b^`#a&kvK#D|w$7jwTJ9=Vc>)8$xEq8`T zcelXY^jF=%BWo94IDY8x+Q#NQAujiZTQ?qj{@KIbr`>EZ2T@hvA~_QR_Wgh)&%b*5 z+@<5kPi-bp9^~Hbts9@+D?Eq@2%FZQRJ=XvP*TpS$^)lNr8jiz1hxvScDuGsNWiLA zYM%&qw)^d8%f))?yCJ7`7{vSNsEY8V7tb6yzSga}l$txAKYI9Z$L6!LD(DNZp4;4L zm1VZR_~_jm5ASZznydhQ*U#7T#pjNlID2q?ZML>(L8!3oY%TZp`p1uV?%aL~3TK}? zdgkJBpmO%&$-Wz!29BPboxgmzoz2(gb18cBv%9L6rxNt46;hCB_-f*I?7Jcggh`4D zO3v=~h=kUV*r-htXCuIJZ@IRfUw!rBiIWF556mf%GCp~-{pr=apIv>ZkU?EiRR&HO z&pmg1v7p6TyI9N)99*>XoG3rI`}F#aN1t7N*rVo@0aaLpP?%4gIeh-&iM5US_SW79 zzq^)mbNQvSXU-j+&6=(su6}UqlaFo-^Qp5(FFt=lRPNo~`uvl7M~-d0@XCoJM;D1u z0Utlyz5dz5+c%y<-^7NA%){xkhfkhAG7LqE-ne#udu!FE#9Z<$z511ln+Mv1hY!5{ z>+4tFzwyG$r@!)zOBTAzO1@({nPv1k}cs$2&J&9xm!pnl2a;0ngyM|bV8Z9lf``T z+qXad^rQPZwgvn@{fEdD=GZF!08K`47MQC2Dl*$=a#WaI%ZxF@1x1T(DxT8^q%7y1^`L(ZJVJ?p!Y|Uov&eOfek9Le) z8iwJ(;l+!uT)1%gSWcQ#V$r9Mmv8^(vpYApd{>zG5r@!7i)dpjEm@ytb5-JsKB{y+ zk+&yvrW!y%RjehMm~zKzi(Q$`jvp+CY+(#D+XX}IEM~ZZL2!}}4^^kA3B(Xog+&l@ zvL2DvrOxH-FylQ4{0HA8#*0$4`qn#KFW{Ag3@IXO5@#Rp*wvWnhsk;7NMHOoj zezb2KZ9XbFTopMg_J*BBFo30#QUe*NAgOtF+uPnnR?3>`^caRcV9crz`hg zaayId9aZ9Z9H-|-n6#g#56n5ajzFO>0ellIH(@EEqQ|(h3U#KyH6Z^K-@-n%i%b>o z^;}>u8OED(4GsiSv0IqNGc{(LK<>#A6(UK$KP1q2GW%SBV(E(!pT>B+#&<*3cS_x~m#TjEbd+S}Pt1)*tHe$JsUI>}`fenZ*eDN54*;-bj3R z5^co@PJ^e2VsRn?nm$dN?9&$l#+!@h3J9Rbj~zaGwx&i7T4KH132DUYQ7#lL<&7&hzW^yef>E zZ-7{B&6_z0A7?Dw5Ys-uDR~c6^E?rMKCWp=-rGp5hd`|W3uO+9Xl{}Kq&C|cn$|Mr z(5VxGf~a18;lx+J{{kyNy0@jc{o+f{oxN~m==-8_{KWc|*G|9q+L?d+@mr+utv`I} z{KbQW(k%x_M0oIpD<@B$KJ<%!yV@*Ev-HaAXPd;BbZwolymtKZl{0HCVS>F? zpPS|j<@|%YJ3sm74{m+_G*eCqRe%UydiB(76Om4T{LW&v+rRea#hernm~{ZUcJ=nN zM=K)gOMmLQL*M&@*Uvw91gLQ76HzG&M6Z73{D*Jd`pqw|tyYDIhEiU*a^}>f!~M|D z^6X#!?(O$}cWc%(K79~1;mdEFx%A5MZs=9>PyXtId*yLEYkC=8`oh^azjpE9kvVVy zL=XVP=U+SV=+5ph|NZ0ZpFK|4Br*$RRA6fL8{d2N3*Wq4x>f0WDP?x3J#ym23$Gko z4ZX0et<7g^jiqNS>b6H93f>g}K|v`I5~Q4(7LaHVwb;OTBX0|;N(jw7De2G`B*a8e zm_^QAIQ*6GJ-@fwC20QUzy12|y{Cyu6wFCKE z-+STtmru;s8tw{VvT}*O=e70qtDoHc{Qvhe7^H3V+dq7MfNr%rh-lIB%A03idi_jc zXmIxSuRg!_$;~FstlU>sa&GFJciT`xN=Z=}Koh1Wks8A)CYi88bMUs}1fYX-M~<)m z;h(MhS(yp}D8Dc}@%mSu`^n#b@atb*OOOyTWh%@Y2j}1WgO?8-$w+{zl#y8| zHy2+#@`di=dvD+R*}r|fw=*+6ylneff>EKmXTH zK6vLgY6?7BE?hqT^*_3@v$vIC_E-O9=gH%pSJA>)AN6yS2Ui;GJ7UnG&fm z5vGhtsSL%Cu2mZ$A^-{xn+Mx(|KP=LSZ=JZ4?k!5og`;kpfF#!c;w69eQvkgA!+~d zFWpWVR2yo@WG)E-o3S2_E%m$eeuN; z%jGIH&ENm{?MDx`lUs5nW|=LTH{QIkIM5)%a<}}=|M(@dG&%RBzx2w9Z+-ujlczQi z2j+oNUM|o9iT3Ts%m*5Glouyss*P}Jc-DH5CHGt z=n|Kam3C$-As|vzdKkj>8V?gZ5V>%U#Tg@!95G#UZvcJJ7_amks#>Sd{|?;5E{!;#O4+U7vGj z<9DNorDD4g)Ir5Iu}Fs)$zvN0+A^?JtvPgFHJ~R=uhoU#6LjS~Y(-r-^0qz@kyWTY z0V+_eh`vJbipNIb#)wn{)cZ#*|1i-Ew$gRXp`mtjWaUYdDUgz|?5fGSz<+Pk2M%y!GI0?v9Bg(ATtmCEDv($6> z3kLg&xPR|ajUif%p(Y{YfsM_kZMJv!o;-O9s)r9BeEs!T5wPpaPk#FIr%#@I=Ud-+ z?zyusUwQHR^*j1|tbEk>*!ftb?}oN*t%vAjBz0UyVtiCHA@Kr<0@wkchKLIkwCy~85M&#Zm_|MA+7{?A|RJQ)bH zEt;#oA9e}~9yqW#b!wB648n+5`f~T~*4|FnGc(}y3wcaJn9 zpokXW@BQKHZ+!XE?)Ec8oz3QqDG_lQnpPE4Q3Pe}i!FBSh0*Q<2yR4!TtopE z7fsVNyc)_N0DuY1q3i6$BL@zyuXcNEKvZ_NmsYMrNGkB?;gjvHt*-BYbGPhhvJWc2 z-rnxcPP?~UZtuuy*{5W38u`N4o`2=dbF1B*zALkKUOFh9G_$0t-Ex_2?Iv8VhUH#i z=!8{)M0GyT3G%WlS%?5cltGCAOv_FTfaWWz(IQl(P-<7(9S=pBDdp0a)X>ngd3T!G zj(Ih9U4QV{{LlXPubw!y{`lF$*^Js|hDs^X?z0^r{LUY}A|Sv1#pl34&LAj4Q3Ps| z7J!7PDIqO)S4HLZubiJPn!owWx4AH4QdLD@8FqHImwS7N@{R9aIdXK9Qel8*0o`)z z(Y;4QFQ8Dk-`?FR{m>@-=C@xsaCk8c9RSW|Z4ues+g&W?-}>Q8PoM7I{OoCq*%t4v z>$aY4?=Dwa&GVOR3idc)gva)!xp0KEHG8>DJS(!K5P0A_7g@m|1NwYHGSZgLGZj@9pk& zr5k!3x?+MM<78A}YkTY2*4C=uOEB;Ifn1mfqOiTYyX<$N==qDs)(_2)Iwnmm?d|TZ z_I4C-xjVe~{$Xsp%_@%JhUbt%e}n=2iLD(yZh+j)_l?QJzsg_ z%=iE7^|cvwtG(I0nKdm!gOK-D%eKKE{K;!wKYaG#BcyD#Kt}t7Fc?IbS)8RZ!C;Dp zeX%~F#(%N~SSuA7Cy={XJDW!nbSY(54#Wx}zl_^$~E z>ssIk0QdSc!fRyxA(|V6LP?@kJWLJgHRK4vx7xNnC7vT;QWFRcsa+G`KU8!b-h<96 zPtp5G>5ljf;(CI3uPCt!z3K~5xpS=TkH#KEV}hYVCP!SVfL>fX9_jaxp~L!+4QaF( z8`)_;pjMU5^qNP|72Dm&qz9-S`RYj_XlPO@`kcUWr~^eYCU#XBCzlnmW5wT&ThY(u zh;zig4ygh6>%*L1pQa>qjBl`x!FbV7^H7LWExr%S81z>_zCSw=1LS7b6>-7{`mtse zG=_vm#aO+5(At`|TFg#D6P%*^NNd@R2gvt-M4!SCkJZmIz6uDau(7$`G|kPAu0DGB zI464Pr5BGLJ}fHlyz~Aqe(`Htp-vwEv**s8p3i4p*V%&@$01?>Yf9f_bB#vw&a8+Q zSrZ!kwHp)=Q5j`|;r<>Mmg4?#kLc&ize)!3Iw?+8XH=a9r z`oPxS_RikkfrE=Hub%$ZPd)<4le(&y?w|{lJY1-Sj zp6zU}4xe5dxSTnAbT-eRHsw%ME?hpkzBwDZl@z-6;eBPoOoxvwzWM!^QsQCY*=+6V z2luXhaIahTr_LVw;x{jg4wUq(-+KP(lby$Rmu+fT`^#6(y!PhBezn);oT<5X^}+Q| z?;z2M(+4kJKBmeFLODYwOCm*GoT?%-i#j##Eocx@n^LBx&8yXFwd{z9GOZtM&R#h6 zrEk8lc_8oY_49WA@c!P;*2-kc)}=v25mRa!t7T0_s0&!l29ots%Q;JvlhuYEI=c4K ztEY!<1%RyWzy8A~H?KYt*7XC6)(BN=tz3`jq{2^sr~%g zGcfbGA zsWTh9d)pfaHl96Mz5U+J?Pq&OPaJ&tjSHeYblq3K@#2H~&u(9TmcaaZ^y&7n*Y{h` z`rW6ip%hd(bY%VFi>I14?>yUi@ugEYZ#@3puWp!srHyUQIZ-}vc(HjPagiIJZ$G^A zbZv8f`pl8lZjTDNNvUlpH!#R-fg79i-M!({kDfexvUBk8;{3&vvsqJ^XES{Hjq`VI zZK*;wH+n##Op*v~Sw$pFnVKfG^LcIvq%=**gx9VS?KK#OCJaVwSg% z?%a8{T$Of_0qN57r{DVZXQh{%69~)}`SOd$+j-7S7SYc>zMCm4z==~E-~FT4+D4Yk z<$S*O;O^e1@89AA7q6VWaPjDqr%z|=`P)Bu>A~$^toEd?z-q<-150tP+Cmj8${+f{ zup=Ot{1O2yF>dP3$}w9$*|sq>-kQh!Kq=PkPjgBp=9KU|0&jqhKxmELoY(gS0VdiK zdy%~0JN!d!J96(V+Z`l!6RaiLwoz8gK8#QVATk#SuDbE#Nc5O@LOLLO_)9^kg2ODx zL5*T4>?7!N_(&mQK(ECxX568?M--zv-+==JYc7VSD>w{yf2?4_B}>1L@c_pFBd!KU zau#dw0|B_8CQK?q#}U8k7>!iW?+%-jPr?+Z`H?V+Pe;$6X}%!-;D|-zH&vwrcE2?$ zkN;sL^?X~YI5X-8;xzFHNJZ+U+C-}4^#u3_E{m)6;KVRrXtcrw$Z_g817H%MOlzfG z{|@`^+!6clS2x3Wmv*6cz_=|O4;DF+3f?0Qss9KtJ*U?5+8x#NqEGP=h}T2aA12Y} z=v)L7byq~OF^$m+Q~U~pl$!)jeyzCgQpbCWQ#&tiFM!tM4$=13*50x^dgS2CFI@qJ zo$c-4zV$l*NI5;*+TPvUo6Tmkrdh2zsA2y2umJ$Lu!>Noz90I25LOTU2|+Ztc?F0L zEQEGF$!nM*6acT?G5#r~#LB8*@=C6`3!P*?g6$wg(5Sw$85<%3jdo)$G_*5$eD5ocv;-(DSeWb;ZdPULdWD%8=q2JbI8y-h?k%HJJ4L0Ab<5tSLqn?8DsA)){& z`jHjZl#;!HU?G#(5V>qA=Ty9p3<#?Lh;Wm$h!!vgML|8(VfV&na5EwVL=`bNYZ0ZS zD&~1lTx55rTiclT{a_=<#gc1ajcJFWPt@GLvHMs5?N^WQ?WzK0`0gKeuYBRc&=qZP zwS=Gi{Rbbtb5|Le`Mq~;{ipx@H5Tdi1_PD76ipzag}E?_6dvfUUwr=4fBd-gASxez zaOaQz^z{o@j_<9O-Ksxx;mBLRxX#7=_!Iz!en6IuL!0ltb>rXv>62l}qB2|Lg9p~j z04#Fu;)zpd4{bf$TAQ^G?{ELN|MTb19xM@)$lZGnpZ)QFd=r3{%e@y~Id%1e2i>j? z%W~(|<0GdwmbeW*0A?ynpkPlyh$Lt8ZRZ9ZKmB96I>3 zfBf*5KfTI>3IhJ_*5%7bzWoO;3F&fs#RCg7Q38OWFHM_8iV=;>G7Kf>RQf`kfK)_x zw^xUbt^J4p{H2uAd@ZkUv`3C^f^Zr7BS$v3o(;eF>DAR9n=S&u&_8iuW=8haSVft& z$(f7TpP?@)WmOPC?YW)h*(|U2wl+4_fBw^}|ME8sSG9OrtA7kFCM<~(wXJ%?tDJK{rT44|Ha!+AFe19%k6u2 zx4!cSul57aX6^G=&fNO^DXSvU&Q|xgKYELcFl!kkHP!<}&s@0uXaC!qdEN-}$&&{W zZa@`g+J$OaG(=#W zssKr^y!_w~{^U&&=~w0GkCo2$Cg-h>W|KtDXo1%qFvhK^mC_vWDx-bJG5^!P2M3BqCvqi%!LswF6R?FTN zJzFxlu$5#WqW541NC`oK2R7ZgiUN`XdN*tJwg%RMS6Fyp>qKkSQ`TEnRG13_&u44* z@2!6PfBoj+?OiUqeyF|j;RmWY9|+zH zMaI22+(@l}fm!PDO|<1n2Jy6f1+p4YhU{hyrU&f93KJEiYFYv?8CR&$D-$b7LdOi| z!!1GNO(Ta&7>=3(-|?r7awkQbW9}l@@t{)!y(v`r2L=wt7@g7J(kXkaI;e;!DxeJ1 z7|6|F-pJ36vK)J4Fv$r-#mIP_Q{eB=bwukUFC1iloWFwl_hT+>Vbz$Qf$=Q=>&0ORuGPf|0Pgx1p^wE|lavBf>Ro((U`5H}XTU>42y|E@1dLz` z;}68Gj-RN4Bx9JTkG=}a+=CYDH;rGOOl7+WTdXur7U5u=&Qt_7B*HK4y>hgUr&l&86orzV_-1-}}zDjvYHpIe&EZ+T%x0 zQYHjAe*EZczDOyV&=zrW!uo&!Qcit8?CvawVNex{PMrRsxOjG~>;pv6t5v~cr}0Tm zdMJiDv?uJwyEA8K3+~{tCy0X|-@5M~6Hm1l{ zp#2ijTaS4zLZveFHsY0iG5#K-WwN#7wReooA_vj?N+PN`2r-*4L^%2Q;~>P`Bo@gj zS!GMk7DrG_>TuCclu|+%I|Q=`C7<{8B_Sd<6HK#PZ*pofN3e&0Df=x`CP1YYHRrc} ze(lknoq0Q(&*q5v_Kl~^(k>dr{MpA3ufG4FN$p~>HeW2Zo(_*6?xaN2W=z=3l3PU) zA`uYedEVU}-hbzo2rcIA`ud{u@atcGy4>n5%dvTQaq!4oRE!g)glR_YeD>(x?yr7& zZCGiO+gUpsI(>M5TUgsRJ@@(CINW+w>O?W-de0RDdXW|8_kRq^w81GW2ZNYcJoDh|IV}D{pNF& zG@mWj<_p67_|dBCxXHPhw?IhASqtm_i-;*%6Ie9)du}K-h=h5O=Ns*zV{5N``ONdL z9X)e#b8#^D(k+Kxu=((V$3ObNe)ah$j|r2#bSy%dW{Vl-#4Kq>v-Q@fwvYu$+NyiIsl#k5_;Dvzr;)S-VJ@AKu;F+bg+A#$IECd6t$d{@K4=y?*Uk zre@a85;oUA-+pv|D>wE5n$5GXjR{jjK%l6QAh#)A5F~=!BuWIB?%v$~=fC-2Siymf zjm?b>m2~&c79wIMKxpQab4m@ZZO%`eI#i%gPCGlp&;Iq}ou~c!d~IWWeb&w%-rIU| ze~SpHK}??fp+vTtnFJ`Ml$zvA3K3<*j6kTUxwU4>YTXH(XN^@CDI91L0ipuV7PGu) zEN)M;WS=puS8nrcF~>we2n4A~zNiwWOh||cQ`0-hS_{} z`}(v0`CotY_|YomoO0UR8GikX&$l0MFBWanrjut5rc9>Q9DxTSAf{MvDU?4!7=cT$Z_1(}M%<7Jd-s`zS z8gy^EsF91e5D^ol_%7I9W}Bwjk=awF3DOx2h5#*#jiEAEFuD_yuVTJe*1LeQSrDXf zBDOtr1R0Ly+yT0N-!WJKI}DQDff9O;g}RXVH5%Jj_4gPs#SdHe{Wwt^twIinP^W$i z(Qka3PpAkG15zRc-5LC2{nz?~m>YV0W`d>aV2q#llORlp`pNvPILOCm{JnomebtQ> z*f~~%7N8m^6#@vUPf>JDjfDA1y-JO{uE@Q{025@mzXqTJdnfcKzqh;40MIoC(75-i z##4>@fhsFP0M+o7kHdyIMk~`FXnArRKp2^P#C_e}rks6^>LO0{w9R-g@gr7M9EPP( z*tgefhUl6$a{P5{5WwT@xX57oq2_h!87GnD{%ppmj=FpQ!O-)?^B2yYK9h0+#qI5# zw|@6Ft4fjM#}9w;i*L@_=GoJJwd(yG^)%@A3Tk&@Jw#N8!ewCRB&2fo3Z^@!8poq5 zuo)VH8v|QxI0=0A<%Mh!sXhZxs~}7wWUitXL5DU;J@1BM-5EURdoT(43xqD8W75UBjbMMPS@HdW#lI5KBBe&rSr-fo23jQN}PXX9%DO%AzR|B5*0S zD~*k38Q8ShCT*$(1I9%e9#RF{yj8)wc$zW40HXKPHF1~Ogd-)Hg^DUEBFIn( zi2%4W%ek2F0t(PChoR>(Fz_(+3`kbLAVvC>2xHgxDW$$E3aI8yp`fgV5rF!BrIH9y zWHdf21EXkPy!uL1wQ$1p_~G*5{jHPF9qflbVY9J5f53a00KvrHB~!X{`{~|xAxw6( zghZLjz|EZ2H)gwAO90qg^-mt}<=luUf)HRoz~e_dCogUet07Ty_~_c_A3km<-@W-{ z`{~}=dLFvr#Hqtbp9!cipL^~|)8xJFWz)3RKDw(6f;!u1=JO=PzrvDlE(l z-giRHx3Toz(3guyQSKELSrieUJ=xoNx;k*E-COl9zJBiLiKDkZe{%cAqeqXnww~-E zp!W@60RS^25>aLu1`Be9nQdkZtCB5Npdz_R(abeR18D_-oYQiz%am2L6mBvBLf;n) zXaRt7Dm~{WA3C%)bc}?nVYu|diE<7Ai3`sbZ8M)QHr7?3FQskUoYUUW=admZq--3V zpE`f+G*6dmtLBAdj87k(lKdb)*ILEBVg%y_^9b0MfUYdEgJI6(4hAf0JWAg2d1j%I!39o__`0NS~|fm zwYopWC4{mDs@A9?(vd(9Rn_FT08j$}fWTMrIh^230DqPk2gC96P$wBg%4NcKJCcrf zAfh`5f%{^SxPkhMn)Pr%>3ABTlH2iY;`#!})$xz?Lew7AST3$mB2b;s)fx&|!|@nH zISw1v&y9jBh$H(*jcJJ(+%dq4r~&})-GA`wx8C{YH@=jR5Kt6<{;S_Sxc|_^!C!do z)ibA#FBXft4<2=WXD&byiukieB4kY|HM1r)CW9fYM2LNsP_5^y)%B|acsY)FMXS3C zSd~l!S@maF_cBFGPG>54TAOaioUn5vt(hT^=*_WTIWVhlARDoMg$^& zpZG-Cv$E19^m(U%=zUL#%z(&A7tv%Yi^x2X{X=$>V*t-M#=b%TniAPsKw;bOi!y6U z=EMxv#w-zvMwKujT6g-KYhYtEiOs;F%{zkB=X!}~ia zWfW*;Ik#C@0OZv#UU=hc&#P)mNs0nNUrJf_tK|R<&DWd7qFrsR78`Az5pz<4p$z^; zfh%4BAvK8_Oq!ZDhm(q@?9GJ(z3nt2Q7MW9dDZ|@w;B}mqYv-yKG{Ri%U8~xI(KAe zd-v?wV{d-x!n?n@4#8zOrd z2u#CJawc0Ys*{*6$b^&uP_e;GFyEZTegpuRTS~Kx2tY`Uy^7Ys15-m}w08!~UL64d zxlM|SIRVLht;ucTl~my}CNfyo%o36ip@O#a+{_azQInQk4~S$w0oLS%N@^2k1VL&j zHAz7bv7I-=P(ZvNB3gqyRs`%j>$wip(Avg~5-JEKQUC=_nIP2vqN>c+R1OnT!gk&$ zC?=!^Fjq~tCI83_60Ai4MkyItzAGa(#K@R+zG%2JTw^fT$+xD>yF2~;yH78_dSZZb z@Ywpnr-7s+1&YRpO0I(M90ANk8P;BLAB4Xi0$$YwP_KHYK$ffvd8D-qIU$_lJg?kA0 z_-%`@z0V-Ky%ZK*1fA~%ZRou$J-JO3Tc-r?=%kxgU63WD9j1%=o@dH@hf)wsq3_Fn zf!65SWie6Hi5RE_YI8AXeElB5X1A^W?zL^J?S$R4yZ65GQS}$Q@W>+99XU{%#y?b= z6~`TF0wOiM@O{4<4`Ks_v6siWoRF({Z30FkR}&=+4hJic!-`022V8`G2bxIpD=3?I zD2-?n0vnG1G{Ij8pcv?Xin!uKS}QkTj2LXC#kd>|oar$GjIeWh1s2_nzmF)P-dJ4n zgo_WPS_7CGVc5_60sx)HK$Fwd%ksxKiDM$EFpX^d^ID^t`rVOdAF+E4HvCz~C+c9w z4MLpFBAG0 z{OH$I1};2+LXKIgQK&5}f#>5jRoDH;gd4s5y?x;rdU-I4QJh|NIhMFnHTv3vN3>SH zAPCa{J)W8korYw{bwn2HI&DzhKgVfpYn+IUqxwrX3J@`r=n}*{0;+gRU_{r&TAO4> zN92V|A_8w-h!BktXtG|ThX-1Pn|7|86DX(}+OX0tMN~AGHzH#MqZ_W~oY=qX(SluS zA~N?n1rQax6lWtu&GttbxM#$Q66+Pbn9#DiITFG zzF3zfGo(^cWszQhq@A^;D`hb0Etz+o*}$8}KldeBcTW{m`tZG5FTZ+j)pcu|YsXI< zynB87*s=A4ht|5i)x6#Kkn@22#XA2<2+K!3Ko=>B4v<%DT{fo%4r2niC8q=AW!lnfKnJFm98X$_07fSpWOTF z|N2`JRKQ>V^7H@K|K~f$PHyz2`_>Pybj#J-zq#G!h6u~RP19H(4+Rj`Zg&s{tAiJo zoU)XG2fx%ZFtZ4&W+hC&`Nef8`o=dduN__tT^WWlbi=%*SHF1fxl6}>`}1obe{k30 zQx#PKDS)I(s&?bn_**4qQW0T6NB}4d2*@H(H0NgMnX-zg&Fxh`a8Up(MG+y|nkEHR z4p?J-kq5{#5*1Kk5fjjZQkzp+tWl;?xSeGYVbw2u?cxvr<5w`rvfFE0l3x3chk>~a z2uey)1iWC-?a`UF4B9ORfCP$CWY9w7ig{H{l%z2CoCsID1u=MPjAF#tMrMOZCP5Rp<;iY1(EeI{WUx&cIaP)Z7l%&OMlRzQlV=xV30 zk+85;ihBynmeJCc>z_Wj_`=DKyZLN!=KP7PAKX86_6P#?-LSS;|Lp4Z)v|B%ycAKZ z<0t?Kxow(+)F6urFe%Pv8Jqba^Yw#^!$-D}K#C&z>cK@4Q7OgbKbGYPS0A#wvdnf^ zYLfLDvq+%sM<4=-M8ribHi*%43sLrlIquIB<~sp+&=+&t9SlEez*iPLGMNlu;Ha&I5#;m%<9;JfT#>2J*v!}sLtDq3!hi8odAP}ckbSN52C14F#oarBp zKP}S0IJn`kxZvt3X&b)-*?`fppX-PK)g4zgxZows|z@Hif{!|zfDY);*IDR0`6a54Le=h?7Fc}s5%QS`v=syiFCeH{eUtXa< zP68Es0^>#akG5!xji~%{{=2u|R?xlOrKkcD60*q8e*Wus z-}~VGk3QPo-p$!vjmM~Z61?XotLk!Zg$RcZ9cr4fqYaoxXN@vra{CW)Fnbm20GbLg zRlU%pb@_NNI7X`KJxvkO{VQNv8&pf#ahgH%Ozfy{!&qoM-u1ZLrSvi1{4yqM7O3YO zfczbUSeJdhu(f~yym_h$i~Ib5yW=|jgRWJx2*<~n0MyTGk&+=-o^nEdC5q&u=R!?e zivh@t*vPNB>c3M;q8h!x>Wk_h`B1WS$0HB-#-_>4Wxn3d)-pZo0l@??xlPSH10g0N^4e%sNhv*gxO4x`)8pqi z6!qlkL+_@WM~`o;A8fiJ+gp1#Z$2S(^CA{8vQ3IU+v>KSJX`Me!rCvnuv-1JmXg|> zQrg{G5g`yzB1!~=%`D|M5fEGTWTJMKQ^5XcFRa;=4NUX1_-qYG+70XB_$%)i>iPrOw(Gsai&Adt3S!7Do&QrU{ zn9zNWbI^)NsZEf;8;|685y%ANlv>L3L@TJR))jzqqC^5pnY?loU9(GxR7q6VHfM{C zwsc5k8;XUT)6>VhT%?^hEPUeBfs>~X+`hh*8}ooe z6SUa-Yc(CEl(x-C1O+XpK@DMsG_y6zm*A8WBuoUkAp`-^7!1PX)25j>1~d`D`)Zl! zF;G`-@}1jHmb+cvpnm91oH?-AY|magrX)?#u&AP{z^z+PpFQf5 z5G7#2ZdFPtyHA$`m-%|T-0CpQ2FV@O$Phn7n!>=k$3N9Q!nXM^s{voow6N4^;G3nl z7*{(c2&8OIiGpBiA=?E)5CJ~>32n@=YHKUWji^Sn8F%0-yqj`5fN(L7&6BVtMF7!g z&=94uEMAp|mYD}sR0@+4M;acem{T0ok_j6Ijq7%}VpKXgq8rf;S_dJ|{M$S3CPk4q zunpR;1fw%?j0{v*8?p++30NIGL#IT(vga@=0fb6+o3uIhLqM8y)uI zG{A`GQjcE)7z{kDIJw9DxD@_x0)RN>bnMlyYm6c4_v4o0uc|s$(@qsslQFC30stM~ z7Tq5f;^;^hGpwQiA; z6Im)c?DK1R;`y&`*rjn z-UJ&3i7*Mnbr@WSLlJ8tpu=K~ES|8~mP0kw3Lq@z{7~lu3+I$gk)OhkSrtq+suDUn z6@{dMyu}?qImW>fBdYAW2oDSVe^3e={$o~KU%V}`s;XK0tAziLik4Dx_FA;CRT=+l zvm~Wdi;Qg-H?I#V3<8!A0JEw{1OO~jSoe0jjg3Z%!G+-6Rk@e0U#)MfmEMd@JjPQN zVMa*YF%WVw4-72>4}HlE4t-H2QIm$Fr8Q=2w0U4nSabkUTrNAei!nZ&rQaQfj{C0I zb0`B_$(f4mZZCJXR!7&@x#PCM&5hZ;vYj%eL{bz%*Ebg+D!tGw?L1vsJ5K`bm*wh5 zw@;jZdAYN9^7O%tL+z0h8_Xp^y7B3~z3sk9nTH~x%e}ta>nY`i(z8cgN)H1LPg$NL#bOQpZn~>Q1B?z>;&2RnU`a8e6aqQ^E*^9@nym5BE znTMfoa&zkRk=Fl8G0vi)@T%aJIx5EffddV5hJH={zt&xPP9z48u zU~@5aebeN7x1Rp(kAAiNcsZZ71526%s|vFSQP2dc{zi*HzbrWs7ajW2P7wLBAT-<_ohC!UTJJUB6a`K$#6hQdQZ6$B`&q5@om z8LalnOecq-^u0DsLd2mTa!OAh?%cikx(acZ( z1VC5Dt0qd%9`1a8_3o7~p6gfL!Nc?Omku31y4H8ACguBgw(j5CQo*943Qr&HE}wST z^s}|uvj@w+{vW?nc7NoM=zt=sGAdZ0BrIaKZ=x!il9^VSBb=DErDs#CHk}m_lQot> zr09+1WdlYWu*X^oo^>&EPxG$O;N}gQ+kR(}zsq=h*BjOOB8uYsX%P`oTZkaGR|U1C zLA@TduEU8`oRQLK7c*i?OOn&r)znmr_ATG{tC4@828ZvqxqH81@JkXk*0DNdRG*j$ zx((yZhTgFvKO?`^D4aEz)jqTC2A)cBH$JTbH| zh9Uj(s!#evgJV}@DA&40OcMv5F^K!EsAhVE|D_YKGl=y@jM1D_S4Uj(cVPqHRg^0YS0NDX<$rAj4&F< zT9de`F*D=m$B{j+7<-aG*%xt6o_rlj099>M`uaD%^2X~g=bWVo6725o+zja*)81f#dX&=9xrfux-CO5CKY(&gXfuxkczhSVZEpzM4o#2DQ$XXgyY=L7yCT#3FV>qvY)_ybi&e0mf_TF|t@6F&O&^*ofD* zg`n1b3lXt!8IKm4zLb-QSQZrl%mvGQ*1#Rv6e(ib8dBPVh~75Eb^!ME+K^C839?Q! zXuXgOt$^(*HvS69*I+!$p^v7xHXQae}=6jY>QV@Z1;`E`-19R5Coi)#% zu6CZSQbH8Kgj|>s&KC_O7iQWktrk`#VjdpceRAydMs8Bm()o+WKK<~%b!HxT*gV`G zJGQRCO`C^a9^T*fHy$++-MId^TQU+Z)|;<>{o=8c2PmO1+`9f)il&C7Fd}x#VP|W( zap;h$Zmus5ZY);McAB;UvZ6pPMFcz{xhfSfve@X(R<+|qn)Htdy{c%Z6l z>utB{xtAtq6@7Sj_twp)J3HIo{SU9_j0n1MU`8nf#{d9omMO!kfB+#1IthYd6ob}x z0(_6Rx77+lEXy=>yWO(afpR7jnINOpo0cMNZdCN~qb=1lDstq|`la*7-u>O(wrSdA zHARC*xk5Q!bRf zGnAXvmdyXB5fP@CbJ}ut+kZNWAg>!HQNhstGjl~3)omhbTI`C*f*G%jGB6;~d7w%v3`E5{;?i4-$3~ps^j~F!LF=1U1=gk;8DU#x#c@Aw z^tW;x;R?YjCmFx5H{%CW80S=l^b>R!-vF)O^O+Xc2_y2E#3Xi)5l+?M348|B3m>%} zj;Vs$ub2u(>>amM?`YrMjbO&_E~2gdEHJ+o`%qm8VftX0XYQh4lHeL5W zpn4)do#V53TF% zBVI(91S&W=Qk|~x-+CD_R+JcC!Hev1i(zdw_LzT;8l)GW=|EFqxG%`x=5cWS(n>wQ6zB*AE4>*|i%g%tK$yE1eK1QyGdTCCa6j>z_S%@%3|}WyO5{ z^0AlRIQ8+ncT{L?qxs6WURd9pEtgxf#oC>lTlep56QZa{4~gi>gY8?NJ-GPliRJF{ z!VAY!qEd8ctG{#O2?3S90BA~iwH!XXdjHh+{Sgle{r%xUH%C}yeujg*n zrPfGs!BTRQ%TU1bGgkY-qM>0G(V-jCj6|^C<}yeER0L(EoR-`DZ+`X3pZ=#WKHJ`H zo95Lw&;8?Hz7L2gCGKT+cO@caC<*E1FPvNMb&ntHwzK)MQwLxB%7ygEd4Wx2C~;?NReHSf`NLP= zShaIhlsCV6sT8?!{mE))Xq!A=%ZE>F96GeVyVKwJ{632?>uS~WzyO#M96r3hSkL{? zHyO`eI{M{rzSy+TcTAK(y^n{%xWb~MDW%f$-j2JJO1X^FQx|i zWj9|eR6$rpHDekEMg(izNEy8#hZzxb%2(gN`|fj}zy7sL&z^3t`tH)pC)YOH_kZ{K zz1v&;-q6m|=8^g7^GD8KK7RJ{@!Ox>cc&ADz1>b3l%Zdi&BJTYzjWf-2lp21i__%PRBbAxSL)|b~Rt-&Cg zs#^aR(>jJ#1|lRh#ipqo$x7xtu^O1ik^mUi`}GG1ZLK8@!r)GgfOq1IsuD&uNLX+s zDZr#!&!CTUc@B>Z0=bIS775SH*dAs%Y>1e|t~>VS%42${5OvHVTnRE7k&kC5>UX0n zv2k}mG!nm|@piGd1kN;cSQ&TE)dPU@xg&@ga~T23YV3jI?*m4{1fdxaii>l)eFE2X z+;g!uN-#u?(J5?7pU1!}25!_K?;Vd-v@-#x6Eqtd6P^BkOxIN87EmARINR|lcypNM z3Id^Nl?hE~eb*YmerWpp5}=4VCKbvaM~0ASgmE~Y&CfYLts2?HSk;S*=whs!w!c{# zsD5D@yTIg_QxFgJ=uo2qS5aB~S#PR_oEDQ*c8O9t6jI(55wcf&xXD`b^Q3MTYd7uXN$$!`SWKv)83Qr zz4zbmhcZ&l`yLp8HDqlv4LA(L+S-~SS6f8vHX-){ftplG zxUs$&qQ!bq)pf=_#Cui)6=yMQQjzPL3`u*O3Bgf-&-*be7HTCEOF-}?b$;7&hJ^06 zW#WGvUs^=0%(PvuS?XBLu{Ywi(6vt9IKEw{-SbGaqpPS50L5X!U(0Iu1_%H-C&%^H zI1HplHFe1Y6D?Rd9ms2MJeTKk_~@cvcA^T%uYK|C(?`SSSMQdNi4p@gO_HLkW!JPb zyH)GLhKbCua_Gu@y-Atky|Wkv5P^vLu2|JXBo;6=DbJyF1yR5Hy-VkxKeBw*1Hy?@ zhfkedUk$r!>+4%jx{uzyY2s*Gm8}19-&qvqP947M5P?e0`Qg2-Th||5eDUbe_p1HZ zzH|Ax=MVQ?Idb^Gp`&Zdve(XMtEIgEo14Q*n%t_2h%`AP(A5v`oV$D+!30;_&gP$8 zy|LOG+B|c2I8~x_?UM)3zkK@S>4VGV^1|h#r_LRI`gC_^t3#yR(B|RAfupmXC;i|2 zw_iWLzt>RaVR-L%pPhT|NYgf~<<&ROojh}3``L27wm5qHK+d|i+@qW*H~tQof9vSW zL8e0xmegiTp75Zmf(x{QLaJ@F0CG+@K70K5?#_WD>wW1jUOsv1?9F?(_Xr3Hx1Q~- zmZhB&D=#+lH~;8Lw;b{;C%|S#ECo{%W=a^fbkNM2Q)f2U52aHV)}K6HZ9iEO!O>%f zPM<&4^J+Gq38Y(}JwidsB%-TT>4&m$V6BwlwJ%*feEh(2S=w3K@5;aY?XLl>9@O1q zD3RBqq^um=hv;f=b@I%?Kl{&L2P7WYU0G0t0TBf0U;gHu>z_P)@_6~t2iL#!_2-v+ zdy9Gc?hjvj`eg6f)4iPY+S+{M&@9hHOZtbu8b0~>VNSHW+x30fT+D}Ixb))5|NMV^ z^V!zkVq<>%#708t%RnjXXr2y);F%2|WmQZPFB-Ff61>16QKDJ#3n^()k-O=y794PKJrih>4Vw4x%ld- zuJ4!2)$ub2Po4kb?oPMd>vGENyjeTYGMAp0*g$SFcaSnYd$QZDhS|Ism{W$Y|M1G| zUp_lq%;vL{8ySW{82e$!^Csm~F@z{61DR|K5Q%_YLSr|Z2-)kTnNm_nS3kOY`N}cM zNeTl3X#2_gx1ZeK%_-L{yvfb`@7%iZ{P9!gH+Oe-+gbYlAHUoW+^veTrY1p_!zbo% z|Lo?cAKy1vX`3*G<37cQ_)Rfu8c+!cZfSSRbwH4tBY27{7Zt0t0r1w~XzvvOgkIlX%HUP~R($WT znB8+DzI$SPSNx_G6{7%P6bfJ@H*ArQtvS?CSdrZbH86ToK_J*Vo^fFng2zErV|+%; z644a?K4h=xH-H8Na0w2v;=}Pu0+){{A>sv(9qQ+&0C(h_CkY&gkOShDM&!94ePjIV zsLY2cY>Y-=anSL=n)`@ zSpWxvCPi76cp)p~2-@Lr_{RQmzVL;8;c`4?&|8A zPMveUcdblcJo)5W?{^B}-N326zwaH^oKI#xnW@{A`|DHj+8e~XR7(ZSg}Ui;sj%u& z-SXzIfAuRzZ!ccF{Oy1ByZ_mL`k(*KZ~t!VEku6vxBm5i^WXmWzyEK(*^mC_8&4mP zCu59+zH8;Lahub_eVk*QLnXji&AymY&yOfKR|s(GT!cI--#M_F#;!C`gpli*Gl+qx z)#3q{?#k7Zx8!?sL2UDk)sOQFXjn^2ua&sQ5Z7dxqIHOKWg`Y4^BqMtAQjg2%=LWK zL_;RN5+2n)XF@jLT0>f?L?AP?s;Z-!FPV`ZF?rTxMJ0*B6d9&0F@oJ_mexovWmJZj zka5nhedTli@!$Vz-}w1=-+24s?RTHN`-M0D&cFYQ|Iy$7^|wF&bPk_mYQ*EwkB8ol z_T;hm!vfgD-Ou^t$?@#TaXj>+ThAOXF~@Xw@vyAF?yc!@=or(dkKuF9dGmQjYwdGy zKl|lh`^vBX#@GMm-}#v@fBj9D@$8Lfw;})IfA@Po`HN4Rw(~a75{qaI8Fu$Mrijep zs*02*D*E#I{Ga|mfAE9veDL(iliphI@wIP!{uh4b%WuE)=rJDJqxkWg|M-u;`zJp( zZQ!h{>NuyVefLk_d;fbsdG_RqpV775UY+0k-S7EOl;oVl&vP`j=O5nw@qhb!Kl<~J zo;`ae;!XX_UwQi%e)*?=;a7h8>wo17pL^%Ai+uj`PrvZRw?RQ^+P?j7-}|Tk=-)^j zkB^TpU%Yzvr{4a?U;WZozW({+v3>ND7oYs(#lw@sM8_+4_c120jz=(3IZz%B`H@8A zIP^IB<70dJMpq5Q21v*}r;2|3{>y*yKmOY%PaY)Z@gV=JzxT^;zSVEHvuXR`cYgAx zfAAO0dhhM!r#JUuEm{jvdGUOH=TCq1^7-@LK@1o7IB(~(XUDTQpP98c-+cP>zx3t5 z`FDQ)fAM#J@#{bLg^;sbe|&uQd;k1Tzx8i_pn`Pi@xhNi{*!Nhzw4o450Cn@KmVm) z{I#$C(yxB?$rF3|@|8p;(ZZBvB;|CBRd~$vR8?^m4>Nywh^KGZ)2H_MsL!6Zr;mDc z?|z%NTe$m>-~Jch{x`q#ou^Nq9*52G>I+|d`g6bVg>U?o&%g8T6O%E|aUAjV=`l|C zDewL8`8R*>yS?>?qpOZDef8~M_;*|W!2ul$1_KNt6yp47&WaZd4g_T=&D z<0FnPkC-E{_Re#n;?nIl=9o{PJUl!cV)Eo^SJU$xsO>w)44+2>1`8Dzl>2oTk7i~d z5kWRg_Xr<;Gx19_SKoQ-&8Lr#%_TzT zPkxqH@ ztv6b?^LBglt>dS@`t}!o`psu=9^$igef#szzVM|t9*&0U1Rww8e@!`0= zd=)Vs-|TvfbKY*R;wL|R?ql@BRHApy1u$l7+D%oE5FejMR$_J+gv3O+=YPfZ```Y_ z`#<{NI4qI_6W{vdAC8+#AkM*kxQ5=IkAL`I{PqvN_3_(peon+*zI-{(+v5{$kD|>Z z;^imfr@s8TXKy~9V?fqqDaH^+Wh86gnxSa1n&SM)gGf}eSaQUw@T%uIAeWGzO4Y^~ z63LRMff$E*h{zbDK7q_aq#0zTnodlT3giORhUv4+ZO-8mCfrNWBUy5x-UXk4Q@Sbm zNS=bI+6H%e_ADYY>Tg+SqX_QqFyX^U?KxlR!H^{5XA^+s@>{+&pF=C27Op}IrAQna zkfE`JT?8u(L{J~dPpX|4cz}E8XDIYvl6`w~nJ^P_5N;4a5a_Q4@0QMsdcogFVb~jW zy)J5YGyzY3tE5P6s3SkwIqh{lo>4F>Dz@Y`yeiu$#Tqw}jIK=QMp~HJ_1HRnho3Jo z082TbGQvBA%10@QD_UI0x>5RBO6!WajC1LRHEOcf(^4p;ey6s$rfjqQQ}RBe~uw)H|U`c}?HjYbZdXh=Lhd2DJQefZJu z{Lb$_fBDLqS!=!bhlhvvKltdM|JLt({i{FywQqdoYd`bl{?Cuwr!Uj~!HF!LP%RBq z4^JNY!%7g1Xjwy1)7)R%BUT;;UC&mg`mV4Lx))ID zg+wy^Pff(Np;8$A1Kv(+nL)7#7Q&1X*!(TBI2c8$oT<~KZ97lih#;L76Jamz;hllsR_tC%k&ENl%Z~jHhCUknM*uVZ4f6^m< z@z;O$jkll7n^?0M?cw2BZ+(vFhpDPdc(@Od5bG^Mru&oLpFMly;W)bXhsQ%=9=*q$ z?s4-m#+;`=JUL>HSI=+roYLB-pNxO{Km6f)KltF+{`xoG{`?ziHf}>L=8Q4rC+|J~ z(?9&vKm6tolIt+ypZyQN|M3SO|H@zct6%!k+adn=^mz5^{IhSr_b>k0@Bhr#zxcQR zgJ1si#jB?e&mQ~n{N)WBbDlAWJ$ZOKW^_Ropf=}-2oxz6mDWtPfAIdNpMH9N?%mHl zeR!&r$073MNq_R}NrWE9!_gH9RovYy-g^73Cr_S)w5Ly>K7D-5pi&c=F{Z|}hvVV- z7?e+mE*_7^hli)C_Jw!fe){lU%Jf+^djp0qz9u6R2>+MjD8UOSj{o%L&=!d`b>tFxM&wTOO zTaW!{<2G8?>EcsA{^6%T_}+K_jIG`+xmQZ@v5E=tt9oD95{sS`+UP+N8Cn?&;)20ZN|^-aL*| zGkNvm_TwLY^3z}Y{O#3z^7QdXfAP_KKlpfy_|iFDMSJU?etiB{|JiT;^}qFvpZ}Gw zz4_*o@F8KQO*CG9{ObFE^5LI-^9KlYG1bs1S)E2jq_sZhKxKDf?P>|JM#%*UVR=f3 zdxJ$BkUcq*(yT>Bka&{jEiLtFqxaC3sXQyU1T>ARYSNHAm5ag56ilI+rD<%T4=rc% z1Z5O;euy6+Lqis{+hn3DdFMfvkp$cVkkQKHS9oQl%&N#b%I%pv-VJ}Ls$^bHM*W4L zW?b@%n7gk`{z}4xE*P0FO?gf$J8xl+Qu0(7LlCwpGr>gGfxE+Xa{0;6)9X-%PQ3$` z1f2`HrB)&A&oTujj9QN`6#D#T@w5p?S?a{)r`PstTWmc~K?#MX^7lo)SGxzCg z8oeru5VgH(^BzQMW^p$j`^ZFbE_i=-{-Q8d%cK@-Jw(fQnTF&weETou<=BAuZAAkEh-)outIJ@66 z$QAoCBZP3$;na||7mz{UgUhZ)J7Q^9by*%5OiWapypExWs8yT4S5;t5hGJ~4pE1a5s1mCFAh5p#N$^oooshFPVE zn^bj@1WB_&nyj$PI*TH0n>nv_mZy39b5G|SBiv`S!^X|k)WmKthlHw$NAyEm&v-Q% zat?-Dxc7(F4iHg7L(h{{V?tc!J70L#TS~!?KYB55B2(K_{rmstzx(X1)>Oau=kNcM z|Nh@R?N6RP98cal&gq|g{NhL7`&c|foZ((~kKXm^Tm9wBQ&o@FKYe}+HxV9HrYL5K zqiKw@9d>kk>+?^J-kv-;&f9$X>U{sbPv;rUTI+3$(K;Y?Zr?fQ=ihzO4tsT*k59UW zzW1X~Od0|jkkES0NY=0Woa3!`9zXZavp3#&^6>D`AKIs%zWnfmPu~0C^Yi8g`8`7v zb#`Qo^R0KEeDS9~_fuc~d`$oN`)lhZZ8I^7fXb7i^!tRi=gRY zP3(vW8*{3t4^Yd1D_0AGR3@`9S`>S#?e}P^Q|YQdK>3^Km6q7N2iMQ zqr*K2V$XSw$0zOWcb-0d^XVLO44>zir+@s>OQk~?%pZ?vtuYV!e0a2<{^~pD`3g2y zIQr%c5v8L`o<2KF?JvIn(Ku0n*4%xJ@zy(!U;N@5Z@>N2%tG|zk6wKI$%`NV_|sRP z4i)RLrNbF$aUAxQuf6;BTTh?8_4wiYpM3kz-hcV&`MG!Ac=ASn@#)Ln`^O)=#9U8z zYx?w!ht{hiVRL1G8sfb3z!xIbjaD8~veaMUFHzTOA7LQL&A|9VTJoNtK zA3i^Cu=x11H~W|#8c&}-xxE-KUJRfgYtkP~T*5*_UVb{vn&eUGtxG%XcxZ3D@%ZAC z^MemwT82rP#}tdV-+p-Koj1Pl<;L{gzIvhEGBvzM%ySY%gjwUEL2Jcyml$Kb{qB=@-hJbZHy*JuKYjl4`SaTc@4q-- zo)K~!T~bC{xZiH)v$y-_KL6~CUwS*-U%VVY{QifZesqfH!_(FejfnH*7(;=KTbF*& zPU&%b8LF)r5=)q_)y=KRIQ^3kPvmewRW(9qRgrTHk$8O8 ze(I;+e){AgRA0S3&vU&0{)?B-Z$1Ob{)P6@nekL$69qGNq;%6v^#h%a7MV;Qnqj_> zM1-wiW9k@Z$&pNg98uwL*vmv*5+Mvjivs0o_FC3NpuBt&(%fyrF53XCui(KG9;7^? zhf7yJenN=lE0BWAB|vwHTq97oD2-)>V6>8a$U?!i@s*oeOKM-P+yGl*lk8Wz7x>wR zyoK10C~$$vLYxGbbw_ounzN})3sUnL{Cw+3;mHfW-*5cOuqz>D{j7cv@9$U2#bBLx z7tXx=yES#`8w<$(Q2yPdi0hW}TR_CG)jeRw!}@5jRtHT=M}QiRF8&!mEJLl^qz5CO=NZ7HjUwNQV^ zE(pC{r4m3F(9Fb9{AZEvSOiL2M`7j_+6I+RNPC9j#Hlgl3eU56Y1cXT`TWeOo9lBs z))5hiG|A$SYMyz!L$oph;pm*Xkt+NbLt)J(@@Y`@$HVc;%r%4v0R`O@*9(Z5_|r(V zP*PVhek$_e2QToJa38NEvMHmt#?Gn_9XCfcGsv(s&$M>l{C2A~gBlJLQPO_=!%sP- z(V8K1OFq;>RUe)n<0kLD_uNE6-91#SwJyCJXA1c@hWzA5FF|&HA*1y!bgazjN>2GW z-Awy&sOpPP$L;oVjDaMWX07-3@St-#h7{Y@%wV1B*4}^r)s5LN$_lKsUN9&2DG%({TdK|~g=krhh;D_J-;~$OFRZPu#KW;Bayc9t; zEi4ZaL;^^N8R`#YmIj1+k13KBf=j4lUw}9sW;Raw-nTyLhxt6!v}GiT14n-F-ud1S zew-k~R9yS<;66Wm|ArU3{l%KTO=I5~&{WJXf9WKmO6n zaDRL}dRI{y1Ib&CPe1lQdhf^9)klW#C=RuDWSspBRpgS_aq~a__D}xo)sK)#<>BFY zczF2eqZjY}=tSvaWV;WMaB-23KX_%T(_bJsR&R4haXuajJ z;W3AN^pjIW{QX;a^rOL^9bzASc;YyJ{^2LBwXDsoI;W3MCu2{X$=!8&nAv&8?dH!v zo*(@9m53Zi6TrSHsy63*{;_}j!AIZy?ni!lYjzv+-LJjM%*DLcDlbe3j)LxrI|Tnb?a3teRdv(||c2{FRd5;efsWhf14vWj3vsMsp3sVk3A z){F3-nHHxe8u8`q-ZEq+!k3h#t9`O2Lkl2AXmI6UodB|X683)X zlcby0f&q=!t}GCqI4(OK)DUViatqPlao1a-%cz~UjKtN#ZBUB-5!(vktY1`u3#{M9 zVYMo+kJ>iXN4)V5|M-u7-nw{MWwx<;TY-FV5TTJag#EPJizO(-$vZzV%ig=fH7XErE&M-Ft5cQA5Aea*Qm_ zw8Tq}E&Yzm4&hl&Tonf>M@D6CQBkf2rW9D(Q6)yuP+;XianjtXA@tiU>qQnH zP>F2MI#Y#d#e}(vg=Z5MZa{irjzU<@5XZ-GH}?pEWf5uELVVIrkIdYv4DD5g+zJsm zg&{MhPgQHJi3E7Ys@jp=-y@CH8o*v=S(G4;WY&EFf@#+BDAXp9v#n(~KWt724K&c4 z0z@NQvnHwF{(4bHbA_hl@*`KF07k#;bF@oIc%Dn;h|@MuW7di8*{)&t12Pq&HK?{YnZ-krWGTw+zCz^u1(=Icu+~DAvGnwBDO*v~K5lW`zeTkjHUQT?CRIty>p^ zax;gIF`%|$Hhr3^w1=jmO~V??62+8M#TREPR?Ta6 z^oQ0hsPKrWHt4agroAFzB-co|gy!k-K+=Xahc<(>1g;!=DjhYQUO`H5?#qXG+c1q_^~BW|#-^ zqPCVH!gin(wCAYC@sOWDBKu_8V^u?nFbHOMQJLoq4OO!q&p!X;`A4tZLkEt^`Guc) z<3Il2|IN4Ge*EYs@4x-Iw?Fy#<;zdcCXZqPW_dsQIA=SWir#ML(fjRoW{%4UYc|iR zroFd0{qgY;D;5jV(g_?)TYP`KKO6_5WJ`*n@9k)6ETrh-;@wOdsiE$oI^BIrZ#K^< zBK_!NOdk^m1J0<9=xN%vLo%DbQ|PFKHIod}jE9Hb+RB+GA=)JOP9|f}v=JCGZz75} zpzN6`mUM_9=V@f23xTGD7OJpoW|&qpn{$Ac<4l8(IslM6P@mw`ip-|!syusJbN4Yv zv&=3U5sh0z1qx3I2nEgG)Mk2*Gh8?#Wme4{pu7vK$QLlj;xm;%c2Nrvr1v4J$!{@_ zwv5CHW-r--ij^n`T$yHvJO~ zB?zSg#bvqa3A?6L7X592m>@Uv(+jlKnqa_Cky@|Rq$-A0bblFNlbeSMDh&dw4ZM&= zMu>x!ezr7?>NqyYV!fm3pFDs05B}SK^ndz4{_oD4OX#cH__ObR?`z-q#?vQH{?_08 zo7S!O{@w>4{?GsXHxmtP6Q-Mvr7Epk>-Or^tB0faqw%HL|DffY{y6C7GC^<`37!{t zphH{HE--Nn^WrsV-rfo&U)OLl&lA9y27GO3?N;{IX;8P6J6thu};BAKQ^Wh3(? zuMx@IL_8p&QX@}77X8(Xe3C4?%6W{4)>_pU%j`+0iEE~2!Wb+OR*Q5NQ&Xl_;+z^w zn*n*`cv|Wq_%;A}nn@_IrjTihzK4g$gryTXszU+^0kOB6*_;7v6o4QRW@@TqIutb3 z1jLBX#jzj~rZ(Nr+X*b_W16U0Q&dRB6w*g*BB^&-7EJ@@YnH`>0)#G!D#z2Bo#$x1 z%{i^5p-xrQ6o9ZIXvL-X1{e)8y)_%>Ff%iqGXe^s0p`Xyr$}^baLZUiw1j05$pV^l zVnTEII7%W#YlbDKm}OQwp3{+1=Ddy848T1j9>YCCqX9rT^G>RwHjKakJcg?#XJAej zj|2xZWh7iuYBq;kQ&l<7fz&Y&?JX;CjiYz;$l=8b)OC$ZRN_2vy?y5S@*;_-6 zh={n|&en~YPgKoCVkVVBMP$s`b5nCWTjl>js6*yPOx%xPNB3sEYRwAN{~?%P)MpjJ zP=uALFid|LH)*G_agR@_uy z3;U)L3!fx#(;6QEuq8&vUG4#Qw55?7nGZ!xXPWKk|5stYBTD>qAQW6KGEa6P=)f=d z8bsp>D#(!lZcnX10P&?TAR11_5-j~`7~=)$H{fFlEHR#?Pi(02@@L{$S=s}&U@4Bk z6~}JZiQG|-3f?L~4`ENCS)!-a#E`{0i4D6+l~X8qT&PBC$t~n58-*!#u&YwBzNl{0 z;FrcDB6}SG-TK2e2W4Er$i>iF!%eRZ^p6}zK4^Jl_;c4(jErurynbKT<#5#P*^r3R zO?mIVo+M<^rR?P0`_q(bcL8@@=(F_E8kt&i+q&Q0y{)o@%y}=9?ypbeJKy`k|Mma& z|M2O^C-AR+=XZbVr@r_z-}stO_gj4DyFd76|I`2cz3=@6)>Y)*VRtyTbIdu$7}F)j zoJdFl`IMxc5EnP3wYwMD0aeb=K@f*3JtRgBxf8amG*D)aR7=HYSP<~UtM zJpyhVC>tU&ha+J;)<|n@oTK%OU<0=3t<52l$Pu~bv>NuyF_HO4nA~GT17~Y!soS>Ir37*4`qiaS8Xbp%;GWe^)B8bZwnCRM@ zsp{=^_TKYDjX9=frV;v%utYsna@AR?wOR84r${D>74bR4L##;_>C^KzM56b0-e&7& zL@nbSs2ds{An>p}sBCIn zz0t4+T5~e0!djbj1wc5AF)Y=gIQ?u%o}N&$ea_Nj5$x{MRirf=s2DIEU9LFJtf8SA z9zLTVZJe|929>P$rl#j@s4F^US-un=r_)d+O5_~F)Ov5Q3S*nK))L?2gyBR-_<4)g zTYA}nn@#8RF@{JdMiEoB-sYUs<2X8IKUgK5nNp%qW2%v&b4<}dN2dFerw^Zh``PE- zdg?!??MVxduIBC^ee#iZed}}Y{MJAI<8S`%cY8ZLLZ-K)%`xVb*4ypX*?SX-m@<8u zD)t@mYi6yPGn$!)jN35yAw9E!@z3>HGz08DhG3?ENH5rPDPcrXz568AD+!%QLys z%hLFzlwTMY)W$~8M}#v#D5Y3}3JDV{!IkbUzBoFOKDnw!Dh4Tp} zHUyveAty&<=^b~bdhlvu16><~Bed!#6sDC8%N6t`bjyMLEJRmWOE(Z3asPH<^A^x0 zLat}+5H~gtiM-aH{CJ=A9l)n15&MG3zv{iDY2*R5Td`LRKs5aTKnXaPrm>C z9}cn_g7p)GlfDgrs_JnZc(^s=npgHWjaz0^P!R)HM}TQo#aeERntoALPvb%4++HT& zQcr;ECa1!5%PfUYz>f^pNdeV4qLOBVkcYHrSZu)9iy*E7JpuJx3Tm4rc}Epitx{|R zIeZXThfH>o0$T#v8yH@O_-{2;wM>BKE}}5!dsQxT5HQTcjWrWsC@oWiswzo}b8Wng zP*c@8MiQFK2D53}u*Kr{F(xdtnCw_CQI<%{Ob$6hIqWLR5@x~$2_w;Qv@vE?L{b$| zSB?JAe8h1awehf9GIqj}Sga80N0UHV%@C2}=+J!5^K7kIYY=7!f}R61QlV?9DhLd% zJ&3rN#sFwm5PK}&qhmPe%SUemT;7!WYcJqpZRr;pV&8(JX}@Amce42@7Cm;r`yz~@4WlYt5^Qd{=pyolYjWTep+uWB+vR((m)G|XqlaYW?2?t?AXh+ zSc@a@CjFKrkO3g*C39$ZqN1J`>==M`=&gMZSi4*h~lO1mn$E3C-F%dnKu)nliE=V~NpF z)t1=WMTH3@=%UEJr}MA?lJ2r8Ka|)?XRcVgO?aoI6OdEW!npf3%2LU9W$eIKvobNa zRXH3&H2&X)2Ia^{E!+QeYSZ!2Py<=MtylC$&;Rdf{W&&B|%2=0+li%TG4t^2S=MNb9#Q zTkBY&9=Hz#?~d1=&#^A0Dsr{qM%-0fc-K?00ycjW`jW?ALVt|$MKcTCT3Aa*tA$j) zbaRW;^hUi?^pj6M{pP>@6A>}fzw)zR`}{la{NW$}>4zUZ*E?5FX@MdhG0y2Tj)(T@ z#m$jI1;>Zy$&n@pVVW>WRyTf67k_G5%CLcOr+GkL;{^uEKs&LCS|NK^0H zWxo_9=`$;@3xu(-)(qaoKnQh~i<*=%?rG0fmFcdo800-~LoP&`N#>lHhA5WJCCM_9 zIj7;=n3MHr(w;YkX-USMVg^43OC6=F_dG{%7UqoUvx`0daDMvnheto89nIPpClW!@ zXet4|sS6zX=Q%SdIl`LxoDnkS1V4c+4xQ6YlkDUU<^t$g-g+D7um*FffC21hAZ&e( z>CD$rCt5^+-VJ8gc>*q{6F?AFn2$C1Twty?MIIMHbz7_}y6ja#kuv;t4n!rU6+cs! zxTwH3+>eH;0Dc9p008XRNkl%rT0?hUGncAgSnZ zkCE6#RR@tbd=x-4)|#Zn6SO__D_S$qpxe>LIektud-d|xkLDi7aZH~XfIcQ*@oP9e}ObdHMu}Y|c4d6K?7lZY_BzaIN&CVeiZ_ zBRx&I*Km@IF;(RD>g?U1lA#1L%6!> zOwW{7qP@3JagRA&n#Fmx-Wds#b@6=qd3uHbsbY{@Gmn^_iVZYsJO@iuROZO&*g1WK zz&$v}hy-w%rLCEv4z~+Dz@m!ie8>kXqM9s!p%uIL<}*Sv5fA`6vK*8gnKMtDW`=_T zr(gOgkdeYlc1H-Mq~-|^4y|YHc?J>?lt(0ir%Yf4aWJ7crCV!bj)40Ul3`(+w4W0Z zDQ~4KojLDWzIK6sc-C!WRsqQCjbf^ih}!{}>|yQrBAa z>`ea8P`-jwQAV*HqrU!As9Fk@5d=u-z}X(DPgZ_N;Fims1X-&q9Ff)KLYQg$UJcwK z@owghdb=!u#80S1l}m^Ckk0`ks?Sxowx!MxLeGp4okhXSsHRERJihSgh1GK$YjG+6 zLlu%BEJ3#L@_NJ_?q>_~O5*~lxfgzmOP6}eJ^*U(dQ!gePK}QJ%B7#FR1nNk&5Ej6 zeWbFQzLKCo1Iu{ne~}t6M{5o5Qe3G2L7$a~<7mI}zx*5j&aeE+zxe0B^{;>L59nYB z6M6c^livFC7cV?5dFs>Odh6NW`P+Z%XTS0FCr=;$$v^$A`+>zs0=cA_-Vn)mj*-nO zzN42LVe#xmvW!R&SmYq2wy3s1^R`IJ^H4*%Da*@dB4T3BoSXSSWD*c@lqbXu2mr`M z&tPIrHA{F_mbRAfRYnhEib@5Q#V3(q-k#J6xSV_$Q_&2c4vQ@4E;!9?%ekwpr)ZkT zy7FX4ofidZ#{*Zwl8{maFQyqDGm>5BqP5l{2|T7EppCkF#LSs8P4!#XJhav#T*Af} zP0d>3eh*}HFm z-g3`&9b+QIIRq{>Yh7>}Lhu6Pnwbd`YnZC5^(GO>(*n~c_kgAH*33*%Z)luTMZpC^ zQq)AiD%RULCr|?N0%vK7 z5_pb)ewI4Pt3YH`5e;Epd^5GpmYliTid&Mt zVue)@(g^^%B$%RsO)T%w`o*zS;iCrbZj{Ch<9vG*fY!$YUv~C+lWecxd5AwS~y}OrZf^ceEP>#2369RilaTC|fuu zoy-dYL11VCU}e`4w-G6Qi;`^D)e7>Kj#Y2W>uG;21&SALQ^gkXsS6Uv zGWUzSeB&!$``NF5{hfC{C&kqe`QjJf{d@o6zyI(5dw=IkUwC(VNQist!S3^uPoMwv zm%h|2OL(kTLp6`gC)1C9Jan_xj>DaU93e27sEW$cDWjAs$+Q>TFp%Z77=tTyY2lt6 zl2ju~gN&RG zxx#oFrs|U37^mVbttVv#OUB*Z10);?0oy(#CR+(81AZ-Q6^Cdv#1D+jPX`M(+AJdB zA+9D(#a?|nkp2~^8(RZk#j-EW2I3%1(UIHjvKQ}WnsX*+Bn9*BHyO(F$rJ%VwD*ull z3Ie_bOQQVI!hMVxfdaEG3?GL_XpZUOx7*E3=bXu7HVv0Kr~8EY8GGkEN2YsnSJT_= z1ZsyV6ep^C;C!Cv1iT)@8D1F>>Y_4+*P`vM!Sf*Gd8?8iW_I3A4vAhQzL@RlVT2^let#roRf1p5hN_A0E=;$Bhg4^GMVt=uK~%~Z!2sQW7-;~Xdii~i!=J#VLozIgEp zPBY}8$^!~9DvUt_j04B)_UbgV2p=aZJx@e{0B&L_PGp}nb&pJ36EUa;oVOX0?6~th zL!y~Jd3<<$e0=is@$vDox8rEXlZS^VkB?8DJeVm83X3qA6?o(U$3-4~syfc8U=OP0 z9zjfwp>l9i_QSn3b$A9WlM{?{x=%ntu!bTK+AXa$Q;V6WF*tb1lkDz!gNDEy~s0vGeQ$L zh(`fWTIV=cLPI<5f&eYFfWGqP0td?|dc_rNbMTuD6H4M2+1^Xk2DUCaRnQyqYe(Re866;q=3HCm1ma#>nr(Rh%$#!>Ysq6Fjj0@HZ*p%9G zJMH?`;?`4dTOhlhL6a#mhGDy^ZZn zd|gDmyq&k(iNfPX&fFKj_=PWg;hk|ipFVrC-68IAJUsaHel(Phs&TA&#bbZ`{`>#( zU;eg)TI)~Wcs9!(AR@G&qq${i5HJ@bbETfPmg+Ef=08?>sHL(xsV&l^jZIXdb;G z)(qCxX4ZNeW1TZ8Hx==o}}OzrJB`t5e&uIV!Z8lWQTce>;AW>)LX%-kp2?B~e*fXJ8Hdy855 zudt{@Li*9>3}`#>PKas*^0$g=Mk%zkl#h0FLEajmw9FusZ^x^9@1o{D)Krjt3*I}^ zWSV0Z3?+LVG;3sv2?@-ph#+_a1ia(%m~$RSA7k|1B=d1;QydX1Q@cvK>Bbnx(Iuky zE;3D3dU~!vEvt2fI00-=TLGZ(VuicApAw?h=9sM;@KL#W&2$b|7m>8uqWBt=W%!pw zWQ_TE^b*0^62^_JVjCjbdJ8O0oIj%A=BcW{cLa4G6!X@6PH68~$yg`Yp`cxXCyDGv zW;V`wJakZZ($x^r%tn;uI19sR#({*0HYDUB%@Kj%2sKe!H=%^J-ks&@(!4}#6c|}F zmqEs+ux7YzWiSU{PYb$vdc3is72CORm#Dh?(GMVdtfVc0XQd>u%mF2vR-eB;wAo6G$ZH=lPXQ0x_LazNPmg~(FsaS zw8W}M-J%3@2^v&O%qA+s)RtAdF4aq(K$^yv!8+9rf++%Uf=(LpGZ2uNexWHM77j-- z`0>{+{+Ied=s=rrf_SoPWbr$)wF@y4ZR@IPRZY1-IxTq0(Fk&%g7pCkf-h6fBGwet zVkef~#I%74z_ezB?*Mr~hQAe|4@9@*jaawJr)gq|8Zp&1dm29bkRFA{1<$*;&KqlNoJT);a|UM~&~*wIDPhXB(Q z?gb$j9RZrhkRmH$GCk%*tcOIX8tiM#HiB$@CaReP3D2=iMwl6IBqHQI2a1@U=jaE= zgn53j0LFQ$8ElPWBDBeQu7`}unC>lDkOhk>6Dh(?53hV9-PGIgrzILGnO$2mih z;3%MFMK*ZCx;)N#9DVwX@Hu4;IgVq@G0$n8>!E3dJQjCcBF+=Yc#25xHpd*d(OOf{ zIY#d-LdH2@8y;f}pT}{)DlAPUl6-$W9Aiu$LsfmwejK+~H&t!T=JYuS5*CGft{)%B z`4}D(Orel5riAG9)@_VH_eJ!)o$yqg=P=XOtjI_rQM4jp_ugzwKhLvSLrNB0aGtk_ z01bUWo6Lr6)i6+#Y5EWd&dYksHV&YONvREZQbX=SgTghO0_QXr#&9k@3?#LMlfY%_1%t z2b{UlR5eznGUWb`8PS?b$Yl6(7ClHI70$B}YDPpL=LIT|?2;PlZaMHF_44qyqy@sa z8A4NQs+i~|>lIk$Vat;r$78aCnD`+WJsc&+(E!C;hTt^wtWA@4!o(aW8WW@u1e&K&3zviv1Fm%1=VJ%zhiminc;N&z+K* z=t360B6UiaYC&cJbu-$66XO=%C|!t1jJD+Ky&IlX@;kDVdU+JF<@ygtX75*yZNV-= z`SqNIObVk*0@MhixAhNIq1fKSCMfGOdMN>1zdOA2N)^Qi3MV5Lsf@kZ#!U!_CPPOK?BWzFmUlX~LP*s80^rlNHdD|*AR3-}5(w!-?d4gLNtwXXd35>L5V zvr7>roXlHtg^~WHTO1GHvUG*@uF`w~nX`BI^IA8N>&vkm}vrlMb=4s8np(N{L z)=iNLI+->Qd8%q^5z?%M1T(0pnYP3|*mstA8VsulEOv3}4TZqm%+4{6-kKOj z(wfaNR2$&Vadb742Hj>>`$fch1LFwC6FBk6aHMM1bk0!G<2c5Nbcz}hE#nR~S^F7Q zIQwzTF~J2ADf<`dXIV3Q_38%LW@gi~%tC7&cO3@`wdROfYv=70iGjMvrVW+gOwTbM zj&8|EmDU>KRc^N%2=JP`?Tku*w+D!__ttu!W2m)(U~5BkJGPsJ1xudc&@vnl2)Y$9 z{DR--%zD?F?y^W90=ttd2UW>h1B3;09Ex0Prdf*4pg2Xw_RDb`)~rRG5GbamhCDno zy!;P%rhsRqZmo^srqVLTL*NZSk{>libnkI=5k*E|f>9J)~sNrC5-QS;cHTxa8)IN7dhe*h z5fQ!j858faZuB37^`1ySS>tMEVCkp{en(`5kQ-^%HWMILjq~(NX=Vy$J<^g1^7*Q2 zqd=kDQ8-c%L&8E@p=sLB2XA8V+KO|X!&Rfd~dS?oo@9cBDR;rvV?R|pS^N;aG`gcjke zJOhZ!3uJQL*Y!2HY&iW4Tvau08>W}_C+>{xlcnBBwvZ>Ni0G#2TN7z13J^Cba%yp{r4lEI`FT&p5k{S^FBzb-6nn2Z=k z^rv#%1T6nd&(BZ+l}sVRAH-~66e`lxlbDRj7C{Y;U|%@gZm(|cFuFT+Pm&fyP(V#p zkK^b`%m|M-&l7511^}eB&(7N^BE2K!Pq@dKgB8MHFMUja=3r-7)HBPDAm^T3#6;^|(# zT8RjOxms1nm;+i?gwM!DoBL~uh&4UW5h@X0<+MdGR#|-lXDog(g?h~KR2}E31wR@Q`L?W{oc{takax*Sq zorE071*gw5D?Cu>mz_QsAVvTbloHtMDdMqCQDELIDBv>opfsplX2Aw0?xK7o@}}Gj zN^OV$MD?VUtJ>QeM;y{fh>xRu#d|Uvf(gj+dQNOV5(zy^SX1H?+vK~XKCSPf0OY!| zz@T0MB=JM`LpJ=txn8XNsS!0!*6_HrTibq+(&e9f$<)}ZH)?~0f$$*f` z0>m{$b%DoaX*!;Cq8u9KG?P!A$e4=g<{hcAExm_&LX8~tx}_2?Aik{^EzM^ib&^FO zn=!Jf*K!)yqo}hAI~VB+pgzT0Ld4ec+f?9eq;f~)$C@*AVJNM>a4R;mhoh^8ic7>C zLqv|&-hAU(??+RY7_o7|=Xr|A!$W&GfF9PsRg*Sd8GYie*sUE!dQmRn+yhlj_AO#UIsUVx>Xh}Kk85aryM6Dd@HqJ&f~VO*?| zmJ?a2SA9ZWx|->P{SqOS;o{Aj>?RpFVaU*6tp+nwcNLL2Mkx;>IS#Pbs+q=wU+CfC zfKVHAN@N%`EUC>Dr@3hsJ1`YHx`(Ujc@9(UN5|qfGl|JgnULkBwCtf48#G3r-V;}3 zoI@sk%E*mjX6Jckc!p@8gcBnaHFM)wsJEVcCj<~cyzpR>fk07Btc537hz0&3pP|gx&@=B z41pXm=P1N!tSX_bv5f@8QD$p10pq-(_N_Q$co4l)`hy@VswR;r8UZnE(nx5Vl|~H4 z2<#NvBle7K?vba5r96?0E)Wf9*NB)We<6giXF-|7yg;IqdX#Be=QX1UB0O_ghhQSyhK!z@eY0Nm{2{14izi5rV|kR2~6NYRZE za23=eD&$r`hL65L$NC?Yh}SS=fzRqgV&2$z%)F*R>)jw>E>mLe@OkyPTCoa~u;BQn zJ{3e3AqL$pSt=l>kg!K|bARlY<~3Uz?q5#e3o3xIzC q}bkmpx|-c)G8r+_}U7+ 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 Hu0mjfmN-}X literal 0 HcmV?d00001 diff --git a/images/masterror-knowledge.png.license b/images/masterror-knowledge.png.license new file mode 100644 index 0000000..c6d90e7 --- /dev/null +++ b/images/masterror-knowledge.png.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025-2026 RAprogramm + +SPDX-License-Identifier: MIT diff --git a/masterror-knowledge/README.md b/masterror-knowledge/README.md new file mode 100644 index 0000000..bf83138 --- /dev/null +++ b/masterror-knowledge/README.md @@ -0,0 +1,88 @@ + + +
+ masterror-knowledge + +

masterror-knowledge

+

Knowledge base for Rust compiler errors and best practices

+ + [![Crates.io](https://img.shields.io/crates/v/masterror-knowledge)](https://crates.io/crates/masterror-knowledge) + [![docs.rs](https://img.shields.io/docsrs/masterror-knowledge)](https://docs.rs/masterror-knowledge) + ![License](https://img.shields.io/badge/License-MIT-informational) +
+ +--- + +## Overview + +`masterror-knowledge` provides a comprehensive knowledge base of Rust compiler error explanations and best practices. It powers the [masterror-cli](https://github.com/RAprogramm/masterror-cli) tool, enabling developers to quickly understand and fix compiler errors. + +## Features + +- **31+ Error Explanations** — Detailed explanations for common Rust compiler errors (E0001-E0792) +- **15 RustManifest Best Practices** — Guidelines for writing idiomatic Rust code +- **Multi-language Support** — Available in English, Russian, and Korean +- **Zero Dependencies** — Lightweight, no runtime overhead +- **Compile-time Lookup** — Fast pattern matching using Aho-Corasick algorithm + +## Supported Languages + +| Feature | Language | +|---------|----------| +| (default) | English | +| `lang-ru` | Russian | +| `lang-ko` | Korean | + +## Installation + +```toml +[dependencies] +masterror-knowledge = "0.1" +``` + +With additional languages: + +```toml +[dependencies] +masterror-knowledge = { version = "0.1", features = ["lang-ru", "lang-ko"] } +``` + +## Usage + +```rust +use masterror_knowledge::{Lang, lookup_error, lookup_practice}; + +// Get explanation for error E0382 (borrow of moved value) +if let Some(explanation) = lookup_error("E0382", Lang::En) { + println!("{}", explanation); +} + +// Get best practice by ID +if let Some(practice) = lookup_practice("RM001", Lang::En) { + println!("{}", practice); +} +``` + +## Error Codes Covered + +The knowledge base includes explanations for errors related to: + +- **Ownership & Borrowing** — E0382, E0499, E0502, E0505, E0507 +- **Lifetimes** — E0106, E0621, E0759, E0792 +- **Type System** — E0277, E0308, E0412, E0425 +- **Traits** — E0046, E0119, E0277 +- **Patterns** — E0004, E0005, E0026, E0027 +- **And more...** + +## Related + +- [masterror](https://github.com/RAprogramm/masterror) — Framework-agnostic application error types +- [masterror-cli](https://github.com/RAprogramm/masterror-cli) — CLI tool using this knowledge base + +## License + +MIT From 9a66658fabd8c000fa5c00ce65d9bcc0bee63149 Mon Sep 17 00:00:00 2001 From: RAprogramm Date: Sun, 25 Jan 2026 05:46:10 +0700 Subject: [PATCH 16/16] test: increase unit test coverage to 89% Add comprehensive tests for: - inline_vec: all storage variants, iterators, mutations - metadata: field types, redaction, serialization - app_code: hash, equality, parsing edge cases - kind: all variants for http_status and label - result_ext: context preservation, error wrapping - response/problem_json: metadata sanitization, redaction --- Cargo.lock | 130 +++++-------- Cargo.toml | 3 +- README.md | 6 +- masterror-cli/Cargo.toml | 2 +- masterror-rustc/Cargo.toml | 28 +++ masterror-rustc/src/main.rs | 198 +++++++++++++++++++ src/app_error/inline_vec.rs | 377 ++++++++++++++++++++++++++++++++++++ src/app_error/metadata.rs | 145 ++++++++++++++ src/code/app_code.rs | 212 ++++++++++++++++++++ src/convert/config.rs | 152 +++++++++++++++ src/convert/redis.rs | 124 ++++++++++++ src/convert/sqlx.rs | 282 +++++++++++++++++++++++++++ src/convert/validator.rs | 137 +++++++++++++ src/kind.rs | 112 +++++++++++ src/response/tests.rs | 168 ++++++++++++++++ src/result_ext.rs | 60 ++++++ 16 files changed, 2046 insertions(+), 90 deletions(-) create mode 100644 masterror-rustc/Cargo.toml create mode 100644 masterror-rustc/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 1292c1c..9187276 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -156,7 +156,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.1", + "socket2 0.6.2", "time", "tracing", "url", @@ -558,9 +558,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.53" +version = "1.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" dependencies = [ "find-msvc-tools", "shlex", @@ -694,7 +694,7 @@ dependencies = [ "serde-untagged", "serde_core", "serde_json", - "toml 0.9.11+spec-1.1.0", + "toml", "winnow", "yaml-rust2", ] @@ -886,9 +886,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.0-rc.11" +version = "0.2.0-rc.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d2bcc93d5cde6659e8649fc412894417ebc14dee54cfc6ee439c683a4a58342" +checksum = "a6dcdb44f2c3ee25689ca12a4c19e664fd09f97aeae0bc5043b2dbab6389e308" dependencies = [ "hybrid-array", ] @@ -1096,7 +1096,7 @@ checksum = "ca14c221bd9052fd2da7c34a2eeb5ae54732db28be47c35937be71793d675422" dependencies = [ "block-buffer 0.11.0", "const-oid 0.10.2", - "crypto-common 0.2.0-rc.11", + "crypto-common 0.2.0-rc.12", "subtle", ] @@ -1685,9 +1685,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +checksum = "b41fb3dc24fe72c2e3a4685eed55917c2fb228851257f4a8f2d985da9443c3e5" dependencies = [ "typenum", ] @@ -1746,7 +1746,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.2", "tokio", "tower-service", "tracing", @@ -2037,9 +2037,9 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -2104,7 +2104,7 @@ checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" [[package]] name = "masterror" -version = "0.27.2" +version = "0.28.0" dependencies = [ "actix-web", "anyhow", @@ -2135,7 +2135,7 @@ dependencies = [ "tempfile", "thiserror", "tokio", - "toml 0.9.11+spec-1.1.0", + "toml", "tonic", "tracing", "tracing-subscriber", @@ -2158,7 +2158,7 @@ dependencies = [ "predicates", "serde", "serde_json", - "toml 0.8.23", + "toml", ] [[package]] @@ -2179,6 +2179,16 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "masterror-rustc" +version = "0.1.0" +dependencies = [ + "libc", + "masterror-knowledge", + "owo-colors", + "windows-sys 0.59.0", +] + [[package]] name = "masterror-template" version = "0.4.1" @@ -2352,9 +2362,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-integer" @@ -2778,9 +2788,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -2797,9 +2807,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -2909,7 +2919,7 @@ dependencies = [ "itoa", "percent-encoding", "ryu", - "socket2 0.6.1", + "socket2 0.6.2", "url", "xxhash-rust", ] @@ -3299,15 +3309,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "serde_spanned" version = "1.0.4" @@ -3455,9 +3456,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -3891,9 +3892,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" dependencies = [ "deranged", "itoa", @@ -3906,15 +3907,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" dependencies = [ "num-conv", "time-core", @@ -3976,7 +3977,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -4016,18 +4017,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit", -] - [[package]] name = "toml" version = "0.9.11+spec-1.1.0" @@ -4036,22 +4025,13 @@ checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ "indexmap 2.13.0", "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", + "serde_spanned", + "toml_datetime", "toml_parser", "toml_writer", "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -4061,20 +4041,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.13.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - [[package]] name = "toml_parser" version = "1.0.6+spec-1.1.0" @@ -4084,12 +4050,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "toml_writer" version = "1.0.6+spec-1.1.0" @@ -4115,7 +4075,7 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "socket2 0.6.1", + "socket2 0.6.2", "sync_wrapper", "tokio", "tokio-stream", @@ -4254,7 +4214,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 0.9.11+spec-1.1.0", + "toml", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0e69956..3bf1709 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ [package] name = "masterror" -version = "0.27.2" +version = "0.28.0" rust-version = "1.92" edition = "2024" license = "MIT" @@ -44,6 +44,7 @@ members = [ "masterror-template", "masterror-knowledge", "masterror-cli", + "masterror-rustc", "examples/axum-rest-api", "examples/custom-domain-errors", "examples/sqlx-database", diff --git a/README.md b/README.md index 5f743c3..6601cc5 100644 --- a/README.md +++ b/README.md @@ -162,9 +162,9 @@ The build script keeps the full feature snippet below in sync with ~~~toml [dependencies] -masterror = { version = "0.27.2", default-features = false } +masterror = { version = "0.28.0", default-features = false } # or with features: -# masterror = { version = "0.27.2", features = [ +# masterror = { version = "0.28.0", features = [ # "std", "axum", "actix", "openapi", # "serde_json", "tracing", "metrics", "backtrace", # "colored", "sqlx", "sqlx-migrate", "reqwest", @@ -643,7 +643,7 @@ Enable the `colored` feature for enhanced terminal output in local mode: ~~~toml [dependencies] -masterror = { version = "0.27.2", features = ["colored"] } +masterror = { version = "0.28.0", features = ["colored"] } ~~~ With `colored` enabled, errors display with syntax highlighting: diff --git a/masterror-cli/Cargo.toml b/masterror-cli/Cargo.toml index 3fb888a..9b0b998 100644 --- a/masterror-cli/Cargo.toml +++ b/masterror-cli/Cargo.toml @@ -45,7 +45,7 @@ owo-colors = { version = "4", features = ["supports-colors"] } # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" -toml = "0.8" +toml = "0.9" # Config paths dirs = "6" diff --git a/masterror-rustc/Cargo.toml b/masterror-rustc/Cargo.toml new file mode 100644 index 0000000..2d2665f --- /dev/null +++ b/masterror-rustc/Cargo.toml @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2025-2026 RAprogramm +# +# SPDX-License-Identifier: MIT + +[package] +name = "masterror-rustc" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +description = "RUSTC_WRAPPER that adds translated explanations to Rust compiler errors" +keywords = ["rust", "compiler", "errors", "translation", "rustc"] +categories = ["command-line-utilities", "development-tools"] + +[[bin]] +name = "masterror-rustc" +path = "src/main.rs" + +[dependencies] +masterror-knowledge = { version = "0.1", path = "../masterror-knowledge", features = ["lang-ru", "lang-ko"] } +owo-colors = { version = "4", features = ["supports-colors"] } + +[target.'cfg(unix)'.dependencies] +libc = "0.2" + +[target.'cfg(windows)'.dependencies] +windows-sys = { version = "0.59", features = ["Win32_System_Console"] } diff --git a/masterror-rustc/src/main.rs b/masterror-rustc/src/main.rs new file mode 100644 index 0000000..5cec597 --- /dev/null +++ b/masterror-rustc/src/main.rs @@ -0,0 +1,198 @@ +// SPDX-FileCopyrightText: 2025-2026 RAprogramm +// +// SPDX-License-Identifier: MIT + +//! RUSTC_WRAPPER that adds translated explanations to Rust compiler errors. +//! +//! # Usage +//! +//! Add to `.cargo/config.toml`: +//! ```toml +//! [build] +//! rustc-wrapper = "masterror-rustc" +//! ``` +//! +//! Or set environment variable: +//! ```bash +//! export RUSTC_WRAPPER=masterror-rustc +//! ``` +//! +//! Then use cargo as usual: +//! ```bash +//! cargo build +//! cargo run +//! cargo test +//! ``` + +use std::{ + env, + io::{BufRead, BufReader, Write}, + process::{Command, Stdio, exit} +}; + +use masterror_knowledge::{ErrorRegistry, Lang}; +use owo_colors::OwoColorize; + +fn main() { + let args: Vec = env::args().skip(1).collect(); + + if args.is_empty() { + eprintln!("masterror-rustc: no arguments provided"); + eprintln!("This is a RUSTC_WRAPPER, not meant to be called directly."); + eprintln!(); + eprintln!("Usage: Add to .cargo/config.toml:"); + eprintln!(" [build]"); + eprintln!(" rustc-wrapper = \"masterror-rustc\""); + exit(1); + } + + // Cargo passes: $RUSTC_WRAPPER $RUSTC + // First argument is the path to rustc, rest are rustc arguments + let rustc = &args[0]; + let rustc_args = &args[1..]; + + let lang = detect_lang(); + let colored = supports_color(); + let registry = ErrorRegistry::new(); + + let mut child = Command::new(rustc) + .args(rustc_args) + .stdout(Stdio::inherit()) + .stderr(Stdio::piped()) + .spawn() + .unwrap_or_else(|e| { + eprintln!("masterror-rustc: failed to run rustc: {e}"); + exit(1); + }); + + let stderr = child.stderr.take().expect("failed to capture stderr"); + let reader = BufReader::new(stderr); + + let mut stderr_handle = std::io::stderr().lock(); + + for line in reader.lines() { + let line = match line { + Ok(l) => l, + Err(e) => { + eprintln!("masterror-rustc: read error: {e}"); + continue; + } + }; + + // Output original line + let _ = writeln!(stderr_handle, "{line}"); + + // Check for error code pattern: error[E0308] + if let Some(code) = extract_error_code(&line) + && let Some(explanation) = get_explanation(registry, &code, lang, colored) + { + let _ = writeln!(stderr_handle, "{explanation}"); + } + } + + drop(stderr_handle); + + let status = child.wait().unwrap_or_else(|e| { + eprintln!("masterror-rustc: failed to wait for rustc: {e}"); + exit(1); + }); + + exit(status.code().unwrap_or(1)); +} + +/// Extract error code from line like "error[E0308]: mismatched types" +fn extract_error_code(line: &str) -> Option { + let start = line.find("error[E")?; + let code_start = start + 6; // skip "error[" + let end = line[code_start..].find(']')?; + Some(line[code_start..code_start + end].to_string()) +} + +/// Get translated explanation for error code +fn get_explanation( + registry: &'static ErrorRegistry, + code: &str, + lang: Lang, + colored: bool +) -> Option { + let entry = registry.find(code)?; + let lang_code = lang.code(); + let mut output = String::new(); + + // Header + let title = entry.title.get(lang_code); + if colored { + output.push_str(&format!("\n {} {}\n", "💡".bold(), title.bold().cyan())); + } else { + output.push_str(&format!("\n 💡 {title}\n")); + } + + // Description + let desc = entry.explanation.get(lang_code); + if !desc.is_empty() { + for line in desc.lines() { + output.push_str(&format!(" {line}\n")); + } + } + + // Fix suggestions + if !entry.fixes.is_empty() { + output.push('\n'); + let fix_header = match lang.code() { + "ru" => "Как исправить:", + "ko" => "해결 방법:", + _ => "How to fix:" + }; + if colored { + output.push_str(&format!(" {}\n", fix_header.bold().green())); + } else { + output.push_str(&format!(" {fix_header}\n")); + } + for fix in entry.fixes { + let fix_desc = fix.description.get(lang_code); + output.push_str(&format!(" • {fix_desc}\n")); + } + } + + Some(output) +} + +/// Detect language from environment +fn detect_lang() -> Lang { + if let Ok(lang) = env::var("MASTERROR_LANG") { + return Lang::from_code(&lang); + } + + if let Ok(lang) = env::var("LANG") { + if lang.starts_with("ru") { + return Lang::from_code("ru"); + } + if lang.starts_with("ko") { + return Lang::from_code("ko"); + } + } + + Lang::En +} + +/// Check if terminal supports colors +fn supports_color() -> bool { + if env::var("NO_COLOR").is_ok() { + return false; + } + if env::var("CLICOLOR_FORCE").is_ok() { + return true; + } + is_stderr_tty() +} + +/// Check if stderr is a TTY +#[cfg(unix)] +fn is_stderr_tty() -> bool { + unsafe { libc::isatty(libc::STDERR_FILENO) != 0 } +} + +#[cfg(not(unix))] +fn is_stderr_tty() -> bool { + false +} diff --git a/src/app_error/inline_vec.rs b/src/app_error/inline_vec.rs index fed94cb..6b6dbb2 100644 --- a/src/app_error/inline_vec.rs +++ b/src/app_error/inline_vec.rs @@ -533,4 +533,381 @@ mod tests { } assert_eq!(vec[0], 10); } + + #[test] + fn test_get_three_elements() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + assert_eq!(vec.get(0), Some(&1)); + assert_eq!(vec.get(1), Some(&2)); + assert_eq!(vec.get(2), Some(&3)); + assert_eq!(vec.get(3), None); + } + + #[test] + fn test_get_four_elements() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + vec.push(4); + assert_eq!(vec.get(0), Some(&1)); + assert_eq!(vec.get(3), Some(&4)); + assert_eq!(vec.get(4), None); + } + + #[test] + fn test_get_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + assert!(!vec.is_inline()); + assert_eq!(vec.get(0), Some(&1)); + assert_eq!(vec.get(5), Some(&6)); + assert_eq!(vec.get(6), None); + } + + #[test] + fn test_get_mut_three_elements() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + *vec.get_mut(2).unwrap() = 30; + assert_eq!(vec[2], 30); + assert!(vec.get_mut(3).is_none()); + } + + #[test] + fn test_get_mut_four_elements() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + vec.push(4); + *vec.get_mut(3).unwrap() = 40; + assert_eq!(vec[3], 40); + assert!(vec.get_mut(4).is_none()); + } + + #[test] + fn test_get_mut_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + *vec.get_mut(5).unwrap() = 60; + assert_eq!(vec[5], 60); + assert!(vec.get_mut(6).is_none()); + } + + #[test] + fn test_insert_empty() { + let mut vec: InlineVec = InlineVec::new(); + vec.insert(0, 42); + assert_eq!(&*vec, &[42]); + } + + #[test] + fn test_insert_three_all_positions() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(3); + vec.insert(1, 2); + assert_eq!(&*vec, &[1, 2, 3]); + + let mut vec2: InlineVec = InlineVec::new(); + vec2.push(2); + vec2.push(3); + vec2.insert(0, 1); + assert_eq!(&*vec2, &[1, 2, 3]); + + let mut vec3: InlineVec = InlineVec::new(); + vec3.push(1); + vec3.push(2); + vec3.insert(2, 3); + assert_eq!(&*vec3, &[1, 2, 3]); + } + + #[test] + fn test_insert_four_all_positions() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(2); + vec.push(3); + vec.push(4); + vec.insert(0, 1); + assert_eq!(&*vec, &[1, 2, 3, 4]); + + let mut vec2: InlineVec = InlineVec::new(); + vec2.push(1); + vec2.push(3); + vec2.push(4); + vec2.insert(1, 2); + assert_eq!(&*vec2, &[1, 2, 3, 4]); + + let mut vec3: InlineVec = InlineVec::new(); + vec3.push(1); + vec3.push(2); + vec3.push(4); + vec3.insert(2, 3); + assert_eq!(&*vec3, &[1, 2, 3, 4]); + + let mut vec4: InlineVec = InlineVec::new(); + vec4.push(1); + vec4.push(2); + vec4.push(3); + vec4.insert(3, 4); + assert_eq!(&*vec4, &[1, 2, 3, 4]); + } + + #[test] + fn test_insert_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + vec.insert(3, 99); + assert_eq!(vec[3], 99); + assert_eq!(vec.len(), 7); + } + + #[test] + fn test_into_iter_three() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + let collected: alloc::vec::Vec<_> = vec.into_iter().collect(); + assert_eq!(collected, alloc::vec![1, 2, 3]); + } + + #[test] + fn test_into_iter_four() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + vec.push(4); + let collected: alloc::vec::Vec<_> = vec.into_iter().collect(); + assert_eq!(collected, alloc::vec![1, 2, 3, 4]); + } + + #[test] + fn test_into_iter_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + let collected: alloc::vec::Vec<_> = vec.into_iter().collect(); + assert_eq!(collected, alloc::vec![1, 2, 3, 4, 5, 6]); + } + + #[test] + fn test_into_iter_empty_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=5 { + vec.push(i); + } + let mut iter = vec.into_iter(); + for _ in 0..5 { + iter.next(); + } + assert!(iter.next().is_none()); + } + + #[test] + fn test_binary_search_by_key() { + let mut vec: InlineVec<(i32, &str)> = InlineVec::new(); + vec.push((1, "a")); + vec.push((3, "c")); + vec.push((5, "e")); + assert_eq!(vec.binary_search_by_key(&3, |&(k, _)| k), Ok(1)); + assert_eq!(vec.binary_search_by_key(&2, |&(k, _)| k), Err(1)); + assert_eq!(vec.binary_search_by_key(&6, |&(k, _)| k), Err(3)); + } + + #[test] + fn test_iter_mut() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + for val in vec.iter_mut() { + *val *= 10; + } + assert_eq!(&*vec, &[10, 20, 30]); + } + + #[test] + fn test_iter_size_hint() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + vec.push(3); + let mut iter = vec.iter(); + assert_eq!(iter.size_hint(), (3, Some(3))); + iter.next(); + assert_eq!(iter.size_hint(), (2, Some(2))); + iter.next(); + iter.next(); + assert_eq!(iter.size_hint(), (0, Some(0))); + } + + #[test] + fn test_exact_size_iterator() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + let iter = vec.iter(); + assert_eq!(iter.len(), 2); + } + + #[test] + fn test_into_iter_for_ref() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + let collected: alloc::vec::Vec<_> = (&vec).into_iter().copied().collect(); + assert_eq!(collected, alloc::vec![1, 2]); + } + + #[test] + fn test_default() { + let vec: InlineVec = InlineVec::default(); + assert!(vec.is_empty()); + } + + #[test] + fn test_as_slice() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + let slice = vec.as_slice(); + assert_eq!(slice, &[1, 2]); + } + + #[test] + fn test_as_mut_slice() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + vec.push(2); + let slice = vec.as_mut_slice(); + slice[0] = 10; + assert_eq!(vec[0], 10); + } + + #[test] + fn test_push_to_heap_then_more() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=10 { + vec.push(i); + } + assert!(!vec.is_inline()); + assert_eq!(vec.len(), 10); + } + + #[test] + fn test_deref_empty() { + let vec: InlineVec = InlineVec::new(); + let slice: &[i32] = &vec; + assert!(slice.is_empty()); + } + + #[test] + fn test_deref_mut_empty() { + let mut vec: InlineVec = InlineVec::new(); + let slice: &mut [i32] = &mut vec; + assert!(slice.is_empty()); + } + + #[test] + fn test_deref_one() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(42); + let slice: &[i32] = &vec; + assert_eq!(slice, &[42]); + } + + #[test] + fn test_deref_mut_one() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(42); + let slice: &mut [i32] = &mut vec; + slice[0] = 99; + assert_eq!(vec[0], 99); + } + + #[test] + fn test_deref_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + let slice: &[i32] = &vec; + assert_eq!(slice, &[1, 2, 3, 4, 5, 6]); + } + + #[test] + fn test_deref_mut_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=6 { + vec.push(i); + } + let slice: &mut [i32] = &mut vec; + slice[5] = 60; + assert_eq!(vec[5], 60); + } + + #[test] + fn test_get_empty() { + let vec: InlineVec = InlineVec::new(); + assert!(vec.get(0).is_none()); + } + + #[test] + fn test_get_mut_empty() { + let mut vec: InlineVec = InlineVec::new(); + assert!(vec.get_mut(0).is_none()); + } + + #[test] + fn test_get_one_out_of_bounds() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + assert!(vec.get(1).is_none()); + } + + #[test] + fn test_get_mut_one_out_of_bounds() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(1); + assert!(vec.get_mut(1).is_none()); + } + + #[test] + fn test_len_heap() { + let mut vec: InlineVec = InlineVec::new(); + for i in 1..=10 { + vec.push(i); + } + assert_eq!(vec.len(), 10); + } + + #[test] + fn test_into_iter_one() { + let mut vec: InlineVec = InlineVec::new(); + vec.push(42); + let collected: alloc::vec::Vec<_> = vec.into_iter().collect(); + assert_eq!(collected, alloc::vec![42]); + } + + #[test] + fn test_into_iter_empty() { + let vec: InlineVec = InlineVec::new(); + let collected: alloc::vec::Vec<_> = vec.into_iter().collect(); + assert!(collected.is_empty()); + } } diff --git a/src/app_error/metadata.rs b/src/app_error/metadata.rs index 672fe7e..e5d1f0b 100644 --- a/src/app_error/metadata.rs +++ b/src/app_error/metadata.rs @@ -638,4 +638,149 @@ mod tests { let text = duration_to_string(Duration::from_micros(1500)); assert_eq!(text, "0.0015s"); } + + #[test] + fn duration_to_string_whole_seconds() { + let text = duration_to_string(Duration::from_secs(5)); + assert_eq!(text, "5s"); + } + + #[test] + fn duration_to_string_with_nanos() { + let text = duration_to_string(Duration::new(1, 500_000_000)); + assert_eq!(text, "1.5s"); + } + + #[test] + fn field_value_display_all_types() { + assert_eq!(FieldValue::Str(Cow::Borrowed("hello")).to_string(), "hello"); + assert_eq!(FieldValue::I64(-42).to_string(), "-42"); + assert_eq!(FieldValue::U64(100).to_string(), "100"); + assert_eq!(FieldValue::F64(1.5).to_string(), "1.5"); + assert_eq!(FieldValue::Bool(true).to_string(), "true"); + assert_eq!(FieldValue::Bool(false).to_string(), "false"); + + let uuid = Uuid::nil(); + assert_eq!( + FieldValue::Uuid(uuid).to_string(), + "00000000-0000-0000-0000-000000000000" + ); + + let dur = Duration::from_millis(1500); + assert_eq!(FieldValue::Duration(dur).to_string(), "1.5s"); + + let ip = IpAddr::from(Ipv4Addr::LOCALHOST); + assert_eq!(FieldValue::Ip(ip).to_string(), "127.0.0.1"); + } + + #[cfg(feature = "serde_json")] + #[test] + fn field_value_display_json() { + let value = FieldValue::Json(json!({"key": "value"})); + assert!(value.to_string().contains("key")); + } + + #[test] + fn metadata_extend() { + let mut meta = Metadata::new(); + meta.extend([field::str("a", "1"), field::str("b", "2")]); + assert_eq!(meta.len(), 2); + assert_eq!(meta.get("a"), Some(&FieldValue::Str(Cow::Borrowed("1")))); + assert_eq!(meta.get("b"), Some(&FieldValue::Str(Cow::Borrowed("2")))); + } + + #[test] + fn metadata_get_field() { + let meta = Metadata::from_fields([field::i64("count", 42)]); + let field = meta.get_field("count"); + assert!(field.is_some()); + let field = field.unwrap(); + assert_eq!(field.name(), "count"); + assert_eq!(field.value(), &FieldValue::I64(42)); + } + + #[test] + fn metadata_get_nonexistent() { + let meta = Metadata::new(); + assert!(meta.get("missing").is_none()); + assert!(meta.get_field("missing").is_none()); + assert!(meta.redaction("missing").is_none()); + } + + #[test] + fn metadata_set_redaction() { + let mut meta = Metadata::from_fields([field::str("secret", "value")]); + meta.set_redaction("secret", FieldRedaction::Redact); + assert_eq!(meta.redaction("secret"), Some(FieldRedaction::Redact)); + } + + #[test] + fn metadata_set_redaction_nonexistent() { + let mut meta = Metadata::new(); + meta.set_redaction("missing", FieldRedaction::Redact); + assert!(meta.redaction("missing").is_none()); + } + + #[test] + fn metadata_iter_with_redaction() { + let meta = Metadata::from_fields([ + field::str("public", "value1"), + field::str("password", "secret") + ]); + let items: Vec<_> = meta.iter_with_redaction().collect(); + assert_eq!(items.len(), 2); + let password_item = items.iter().find(|(n, _, _)| *n == "password").unwrap(); + assert_eq!(password_item.2, FieldRedaction::Redact); + } + + #[test] + fn metadata_into_iter() { + let meta = Metadata::from_fields([field::i64("a", 1), field::i64("b", 2)]); + let fields: Vec<_> = meta.into_iter().collect(); + assert_eq!(fields.len(), 2); + } + + #[test] + fn field_default_redaction_non_sensitive() { + let field = field::str("user_id", "abc123"); + assert_eq!(field.redaction(), FieldRedaction::None); + } + + #[test] + fn field_with_redaction() { + let field = field::str("public", "value").with_redaction(FieldRedaction::Hash); + assert_eq!(field.redaction(), FieldRedaction::Hash); + } + + #[test] + fn field_redaction_default() { + assert_eq!(FieldRedaction::default(), FieldRedaction::None); + } + + #[test] + fn field_value_partial_eq() { + let v1 = FieldValue::I64(42); + let v2 = FieldValue::I64(42); + let v3 = FieldValue::I64(43); + assert_eq!(v1, v2); + assert_ne!(v1, v3); + } + + #[test] + fn metadata_len_and_is_empty() { + let empty = Metadata::new(); + assert!(empty.is_empty()); + assert_eq!(empty.len(), 0); + + let meta = Metadata::from_fields([field::i64("x", 1)]); + assert!(!meta.is_empty()); + assert_eq!(meta.len(), 1); + } + + #[test] + fn field_into_value() { + let field = field::u64("count", 100); + let value = field.into_value(); + assert_eq!(value, FieldValue::U64(100)); + } } diff --git a/src/code/app_code.rs b/src/code/app_code.rs index d46b585..bcce29f 100644 --- a/src/code/app_code.rs +++ b/src/code/app_code.rs @@ -447,4 +447,216 @@ mod tests { let err = AppCode::from_str("NOT-A-REAL-CODE").unwrap_err(); assert_eq!(err, ParseAppCodeError); } + + #[test] + fn from_str_parses_all_static_codes() { + let codes = [ + ("NOT_FOUND", AppCode::NotFound), + ("VALIDATION", AppCode::Validation), + ("CONFLICT", AppCode::Conflict), + ("USER_ALREADY_EXISTS", AppCode::UserAlreadyExists), + ("UNAUTHORIZED", AppCode::Unauthorized), + ("FORBIDDEN", AppCode::Forbidden), + ("NOT_IMPLEMENTED", AppCode::NotImplemented), + ("BAD_REQUEST", AppCode::BadRequest), + ("RATE_LIMITED", AppCode::RateLimited), + ("TELEGRAM_AUTH", AppCode::TelegramAuth), + ("INVALID_JWT", AppCode::InvalidJwt), + ("INTERNAL", AppCode::Internal), + ("DATABASE", AppCode::Database), + ("SERVICE", AppCode::Service), + ("CONFIG", AppCode::Config), + ("TURNKEY", AppCode::Turnkey), + ("TIMEOUT", AppCode::Timeout), + ("NETWORK", AppCode::Network), + ("DEPENDENCY_UNAVAILABLE", AppCode::DependencyUnavailable), + ("SERIALIZATION", AppCode::Serialization), + ("DESERIALIZATION", AppCode::Deserialization), + ("EXTERNAL_API", AppCode::ExternalApi), + ("QUEUE", AppCode::Queue), + ("CACHE", AppCode::Cache) + ]; + for (s, expected) in codes { + let parsed = AppCode::from_str(s).expect(s); + assert_eq!(parsed, expected, "mismatch for {s}"); + } + } + + #[test] + fn from_kind_covers_all_variants() { + let mappings = [ + (AppErrorKind::NotFound, AppCode::NotFound), + (AppErrorKind::Validation, AppCode::Validation), + (AppErrorKind::Conflict, AppCode::Conflict), + (AppErrorKind::Unauthorized, AppCode::Unauthorized), + (AppErrorKind::Forbidden, AppCode::Forbidden), + (AppErrorKind::NotImplemented, AppCode::NotImplemented), + (AppErrorKind::BadRequest, AppCode::BadRequest), + (AppErrorKind::RateLimited, AppCode::RateLimited), + (AppErrorKind::TelegramAuth, AppCode::TelegramAuth), + (AppErrorKind::InvalidJwt, AppCode::InvalidJwt), + (AppErrorKind::Internal, AppCode::Internal), + (AppErrorKind::Database, AppCode::Database), + (AppErrorKind::Service, AppCode::Service), + (AppErrorKind::Config, AppCode::Config), + (AppErrorKind::Turnkey, AppCode::Turnkey), + (AppErrorKind::Timeout, AppCode::Timeout), + (AppErrorKind::Network, AppCode::Network), + ( + AppErrorKind::DependencyUnavailable, + AppCode::DependencyUnavailable + ), + (AppErrorKind::Serialization, AppCode::Serialization), + (AppErrorKind::Deserialization, AppCode::Deserialization), + (AppErrorKind::ExternalApi, AppCode::ExternalApi), + (AppErrorKind::Queue, AppCode::Queue), + (AppErrorKind::Cache, AppCode::Cache) + ]; + for (kind, expected) in mappings { + assert_eq!(AppCode::from(kind), expected, "mismatch for {kind:?}"); + } + } + + #[test] + fn is_valid_literal_rejects_empty() { + assert!(AppCode::try_new(String::new()).is_err()); + } + + #[test] + fn is_valid_literal_rejects_leading_underscore() { + assert!(AppCode::try_new(String::from("_INVALID")).is_err()); + } + + #[test] + fn is_valid_literal_rejects_trailing_underscore() { + assert!(AppCode::try_new(String::from("INVALID_")).is_err()); + } + + #[test] + fn is_valid_literal_rejects_double_underscore() { + assert!(AppCode::try_new(String::from("INVALID__CODE")).is_err()); + } + + #[test] + fn is_valid_literal_rejects_lowercase() { + assert!(AppCode::try_new(String::from("invalid_code")).is_err()); + } + + #[test] + fn is_valid_literal_accepts_numbers() { + assert!(AppCode::try_new(String::from("ERROR_404")).is_ok()); + assert!(AppCode::try_new(String::from("E404")).is_ok()); + } + + #[test] + fn serde_roundtrip() { + let code = AppCode::NotFound; + let json = serde_json::to_string(&code).expect("serialize"); + assert_eq!(json, "\"NOT_FOUND\""); + let parsed: AppCode = serde_json::from_str(&json).expect("deserialize"); + assert_eq!(parsed, code); + } + + #[test] + fn serde_custom_code_roundtrip() { + let code = AppCode::new("CUSTOM_ERROR"); + let json = serde_json::to_string(&code).expect("serialize"); + let parsed: AppCode = serde_json::from_str(&json).expect("deserialize"); + assert_eq!(parsed, code); + } + + #[test] + fn serde_deserialize_rejects_invalid() { + let result: Result = serde_json::from_str("\"invalid-code\""); + assert!(result.is_err()); + } + + #[test] + fn parse_error_display() { + let err = ParseAppCodeError; + assert!(!err.to_string().is_empty()); + } + + #[test] + fn debug_impl() { + let code = AppCode::NotFound; + let debug = format!("{:?}", code); + assert!(debug.contains("NotFound") || debug.contains("NOT_FOUND")); + } + + #[test] + fn clone_and_eq() { + let code = AppCode::new("CLONED_CODE"); + let cloned = code.clone(); + assert_eq!(code, cloned); + } + + #[test] + fn hash_impl_same_for_equal_codes() { + use std::{ + collections::hash_map::DefaultHasher, + hash::{Hash, Hasher} + }; + + let code1 = AppCode::NotFound; + let code2 = AppCode::from_str("NOT_FOUND").unwrap(); + let mut hasher1 = DefaultHasher::new(); + let mut hasher2 = DefaultHasher::new(); + code1.hash(&mut hasher1); + code2.hash(&mut hasher2); + assert_eq!(hasher1.finish(), hasher2.finish()); + } + + #[test] + fn hash_impl_different_for_different_codes() { + use std::{ + collections::hash_map::DefaultHasher, + hash::{Hash, Hasher} + }; + + let code1 = AppCode::NotFound; + let code2 = AppCode::Internal; + let mut hasher1 = DefaultHasher::new(); + let mut hasher2 = DefaultHasher::new(); + code1.hash(&mut hasher1); + code2.hash(&mut hasher2); + assert_ne!(hasher1.finish(), hasher2.finish()); + } + + #[test] + fn parse_error_source_is_none() { + use core::error::Error; + let err = ParseAppCodeError; + assert!(err.source().is_none()); + } + + #[test] + fn hashset_works_with_app_code() { + use std::collections::HashSet; + let mut set = HashSet::new(); + set.insert(AppCode::NotFound); + set.insert(AppCode::Internal); + set.insert(AppCode::NotFound); + assert_eq!(set.len(), 2); + assert!(set.contains(&AppCode::NotFound)); + } + + #[test] + fn custom_code_ne_builtin() { + let custom = AppCode::new("CUSTOM"); + assert_ne!(custom, AppCode::NotFound); + assert_ne!(custom, AppCode::Internal); + } + + #[test] + fn try_new_with_str_slice() { + let code = AppCode::try_new("SLICE_CODE").unwrap(); + assert_eq!(code.as_str(), "SLICE_CODE"); + } + + #[test] + fn from_str_empty() { + let result = AppCode::from_str(""); + assert!(result.is_err()); + } } diff --git a/src/convert/config.rs b/src/convert/config.rs index 2432b49..bc79f48 100644 --- a/src/convert/config.rs +++ b/src/convert/config.rs @@ -116,4 +116,156 @@ mod tests { Some(&FieldValue::Str("message".into())) ); } + + #[test] + fn frozen_error_maps_correctly() { + let err = ConfigError::Frozen; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + assert_eq!( + app_err.metadata().get("config.phase"), + Some(&FieldValue::Str("frozen".into())) + ); + } + + #[test] + fn not_found_error_captures_key() { + let err = ConfigError::NotFound("database.url".into()); + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("config.phase"), + Some(&FieldValue::Str("not_found".into())) + ); + assert_eq!( + metadata.get("config.key"), + Some(&FieldValue::Str("database.url".into())) + ); + } + + #[test] + fn path_parse_error_maps_correctly() { + let err = ConfigError::PathParse { + cause: Box::new(std::io::Error::other("invalid path")) + }; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + assert_eq!( + app_err.metadata().get("config.phase"), + Some(&FieldValue::Str("path_parse".into())) + ); + } + + #[test] + fn file_parse_error_without_uri() { + let err = ConfigError::FileParse { + uri: None, + cause: Box::new(std::io::Error::other("disk")) + }; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + assert_eq!( + app_err.metadata().get("config.phase"), + Some(&FieldValue::Str("file_parse".into())) + ); + assert!(app_err.metadata().get("config.uri").is_none()); + } + + #[test] + fn file_parse_error_with_uri() { + let err = ConfigError::FileParse { + uri: Some("/etc/app/config.toml".into()), + cause: Box::new(std::io::Error::other("disk")) + }; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("config.phase"), + Some(&FieldValue::Str("file_parse".into())) + ); + assert_eq!( + metadata.get("config.uri"), + Some(&FieldValue::Str("/etc/app/config.toml".into())) + ); + } + + #[test] + fn at_error_with_all_fields() { + let err = ConfigError::At { + origin: Some("env.toml".into()), + key: Some("database.host".into()), + error: Box::new(ConfigError::Message("invalid".into())) + }; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("config.phase"), + Some(&FieldValue::Str("at".into())) + ); + assert_eq!( + metadata.get("config.origin"), + Some(&FieldValue::Str("env.toml".into())) + ); + assert_eq!( + metadata.get("config.key"), + Some(&FieldValue::Str("database.host".into())) + ); + } + + #[test] + fn at_error_without_optional_fields() { + let err = ConfigError::At { + origin: None, + key: None, + error: Box::new(ConfigError::Message("error".into())) + }; + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("config.phase"), + Some(&FieldValue::Str("at".into())) + ); + assert!(metadata.get("config.origin").is_none()); + assert!(metadata.get("config.key").is_none()); + } + + #[test] + fn message_error_preserves_message() { + let err = ConfigError::Message("custom error message".into()); + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("config.phase"), + Some(&FieldValue::Str("message".into())) + ); + assert_eq!( + metadata.get("config.message"), + Some(&FieldValue::Str("custom error message".into())) + ); + } + + #[test] + fn foreign_error_maps_correctly() { + let foreign_err = Box::new(std::io::Error::other("external")) + as Box; + let err = ConfigError::Foreign(foreign_err); + let app_err = Error::from(err); + assert!(matches!(app_err.kind, AppErrorKind::Config)); + assert_eq!( + app_err.metadata().get("config.phase"), + Some(&FieldValue::Str("foreign".into())) + ); + } + + #[test] + fn error_preserves_source() { + let err = ConfigError::Message("source test".into()); + let app_err = Error::from(err); + assert!(app_err.source_ref().is_some()); + } } diff --git a/src/convert/redis.rs b/src/convert/redis.rs index bce2e3c..9756aab 100644 --- a/src/convert/redis.rs +++ b/src/convert/redis.rs @@ -149,4 +149,128 @@ mod tests { let app_err: Error = redis_err.into(); assert!(matches!(app_err.kind, AppErrorKind::Cache)); } + + #[test] + fn io_error_maps_to_dependency_unavailable() { + let redis_err = RedisError::from((ErrorKind::Io, "connection timeout")); + let app_err: Error = redis_err.into(); + assert!(matches!(app_err.kind, AppErrorKind::DependencyUnavailable)); + } + + #[test] + fn connection_refused_maps_to_dependency_unavailable() { + let redis_err = RedisError::from((ErrorKind::Io, "connection refused")); + let app_err: Error = redis_err.into(); + assert!(matches!(app_err.kind, AppErrorKind::DependencyUnavailable)); + } + + #[test] + fn metadata_contains_category() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + let metadata = app_err.metadata(); + assert!(metadata.get("redis.category").is_some()); + } + + #[test] + fn metadata_contains_timeout_flag() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("redis.is_timeout"), + Some(&FieldValue::Bool(false)) + ); + } + + #[test] + fn metadata_contains_cluster_error_flag() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + let metadata = app_err.metadata(); + assert_eq!( + metadata.get("redis.is_cluster_error"), + Some(&FieldValue::Bool(false)) + ); + } + + #[test] + fn metadata_contains_connection_flags() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + let metadata = app_err.metadata(); + assert!(metadata.get("redis.is_connection_refused").is_some()); + assert!(metadata.get("redis.is_connection_dropped").is_some()); + } + + #[test] + fn retry_method_no_retry() { + let (label, after) = retry_method_details(RetryMethod::NoRetry); + assert_eq!(label, "NoRetry"); + assert_eq!(after, None); + } + + #[test] + fn retry_method_retry_immediately() { + let (label, after) = retry_method_details(RetryMethod::RetryImmediately); + assert_eq!(label, "RetryImmediately"); + assert_eq!(after, Some(0)); + } + + #[test] + fn retry_method_ask_redirect() { + let (label, after) = retry_method_details(RetryMethod::AskRedirect); + assert_eq!(label, "AskRedirect"); + assert_eq!(after, Some(0)); + } + + #[test] + fn retry_method_moved_redirect() { + let (label, after) = retry_method_details(RetryMethod::MovedRedirect); + assert_eq!(label, "MovedRedirect"); + assert_eq!(after, Some(0)); + } + + #[test] + fn retry_method_reconnect() { + let (label, after) = retry_method_details(RetryMethod::Reconnect); + assert_eq!(label, "Reconnect"); + assert_eq!(after, Some(1)); + } + + #[test] + fn retry_method_reconnect_from_initial() { + let (label, after) = retry_method_details(RetryMethod::ReconnectFromInitialConnections); + assert_eq!(label, "ReconnectFromInitialConnections"); + assert_eq!(after, Some(1)); + } + + #[test] + fn retry_method_wait_and_retry() { + let (label, after) = retry_method_details(RetryMethod::WaitAndRetry); + assert_eq!(label, "WaitAndRetry"); + assert_eq!(after, Some(2)); + } + + #[test] + fn error_preserves_source() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + assert!(app_err.source_ref().is_some()); + } + + #[test] + fn metadata_contains_retry_method() { + let redis_err = RedisError::from((ErrorKind::Client, "test")); + let app_err: Error = redis_err.into(); + let metadata = app_err.metadata(); + assert!(metadata.get("redis.retry_method").is_some()); + } + + #[test] + fn parse_error_maps_to_cache() { + let redis_err = RedisError::from((ErrorKind::Parse, "invalid response")); + let app_err: Error = redis_err.into(); + assert!(matches!(app_err.kind, AppErrorKind::Cache)); + } } diff --git a/src/convert/sqlx.rs b/src/convert/sqlx.rs index 09ddecb..62f844e 100644 --- a/src/convert/sqlx.rs +++ b/src/convert/sqlx.rs @@ -419,4 +419,286 @@ mod tests_sqlx { } } } + + #[test] + fn pool_timed_out_maps_to_timeout() { + let err: Error = SqlxError::PoolTimedOut.into(); + assert_eq!(err.kind, AppErrorKind::Timeout); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("pool_timeout".into())) + ); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn pool_closed_maps_to_dependency_unavailable() { + let err: Error = SqlxError::PoolClosed.into(); + assert_eq!(err.kind, AppErrorKind::DependencyUnavailable); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("pool_closed".into())) + ); + } + + #[test] + fn worker_crashed_maps_to_dependency_unavailable() { + let err: Error = SqlxError::WorkerCrashed.into(); + assert_eq!(err.kind, AppErrorKind::DependencyUnavailable); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("worker_crashed".into())) + ); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn configuration_maps_to_config() { + let err: Error = + SqlxError::Configuration(Box::new(std::io::Error::other("bad config"))).into(); + assert_eq!(err.kind, AppErrorKind::Config); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("configuration".into())) + ); + } + + #[test] + fn invalid_argument_maps_to_bad_request() { + let err: Error = SqlxError::InvalidArgument("wrong arg".into()).into(); + assert_eq!(err.kind, AppErrorKind::BadRequest); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("invalid_argument".into())) + ); + assert_eq!( + err.metadata().get("db.argument"), + Some(&FieldValue::Str("wrong arg".into())) + ); + } + + #[test] + fn column_decode_maps_to_deserialization() { + let err: Error = SqlxError::ColumnDecode { + index: "col1".into(), + source: Box::new(std::io::Error::other("decode failed")) + } + .into(); + assert_eq!(err.kind, AppErrorKind::Deserialization); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("column_decode".into())) + ); + assert_eq!( + err.metadata().get("db.column"), + Some(&FieldValue::Str("col1".into())) + ); + } + + #[test] + fn column_not_found_maps_to_internal() { + let err: Error = SqlxError::ColumnNotFound("missing_col".into()).into(); + assert_eq!(err.kind, AppErrorKind::Internal); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("column_not_found".into())) + ); + assert_eq!( + err.metadata().get("db.column"), + Some(&FieldValue::Str("missing_col".into())) + ); + } + + #[test] + fn column_index_out_of_bounds_maps_to_internal() { + let err: Error = SqlxError::ColumnIndexOutOfBounds { + index: 5, len: 3 + } + .into(); + assert_eq!(err.kind, AppErrorKind::Internal); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("column_index_out_of_bounds".into())) + ); + assert_eq!(err.metadata().get("db.index"), Some(&FieldValue::U64(5))); + assert_eq!(err.metadata().get("db.len"), Some(&FieldValue::U64(3))); + } + + #[test] + fn type_not_found_maps_to_internal() { + let err: Error = SqlxError::TypeNotFound { + type_name: "custom_type".into() + } + .into(); + assert_eq!(err.kind, AppErrorKind::Internal); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("type_not_found".into())) + ); + assert_eq!( + err.metadata().get("db.type"), + Some(&FieldValue::Str("custom_type".into())) + ); + } + + #[test] + fn encode_maps_to_serialization() { + let err: Error = + SqlxError::Encode(Box::new(std::io::Error::other("encode failed"))).into(); + assert_eq!(err.kind, AppErrorKind::Serialization); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("encode".into())) + ); + } + + #[test] + fn decode_maps_to_deserialization() { + let err: Error = + SqlxError::Decode(Box::new(std::io::Error::other("decode failed"))).into(); + assert_eq!(err.kind, AppErrorKind::Deserialization); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("decode".into())) + ); + } + + #[test] + fn protocol_maps_to_dependency_unavailable() { + let err: Error = SqlxError::Protocol("protocol error".into()).into(); + assert_eq!(err.kind, AppErrorKind::DependencyUnavailable); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("protocol".into())) + ); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn tls_maps_to_network() { + let err: Error = SqlxError::Tls(Box::new(std::io::Error::other("tls failed"))).into(); + assert_eq!(err.kind, AppErrorKind::Network); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("tls".into())) + ); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn any_driver_error_maps_to_database() { + let err: Error = + SqlxError::AnyDriverError(Box::new(std::io::Error::other("driver error"))).into(); + assert_eq!(err.kind, AppErrorKind::Database); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("driver_error".into())) + ); + } + + #[test] + fn invalid_savepoint_maps_to_internal() { + let err: Error = SqlxError::InvalidSavePointStatement.into(); + assert_eq!(err.kind, AppErrorKind::Internal); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("invalid_savepoint".into())) + ); + } + + #[test] + fn begin_failed_maps_to_dependency_unavailable() { + let err: Error = SqlxError::BeginFailed.into(); + assert_eq!(err.kind, AppErrorKind::DependencyUnavailable); + assert_eq!( + err.metadata().get("db.reason"), + Some(&FieldValue::Str("begin_failed".into())) + ); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn foreign_key_violation_maps_to_conflict() { + let db_err = DummyDbError { + message: "foreign key violation".into(), + code: Some("23503".into()), + constraint: Some("fk_user".into()), + table: Some("orders".into()), + kind: SqlxErrorKind::ForeignKeyViolation + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!(err.kind, AppErrorKind::Conflict); + assert_eq!(err.code, AppCode::Conflict); + } + + #[test] + fn not_null_violation_maps_to_validation() { + let db_err = DummyDbError { + message: "not null violation".into(), + code: Some("23502".into()), + constraint: None, + table: None, + kind: SqlxErrorKind::NotNullViolation + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!(err.kind, AppErrorKind::Validation); + assert_eq!(err.code, AppCode::Validation); + } + + #[test] + fn check_violation_maps_to_validation() { + let db_err = DummyDbError { + message: "check violation".into(), + code: Some("23514".into()), + constraint: Some("positive_amount".into()), + table: None, + kind: SqlxErrorKind::CheckViolation + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!(err.kind, AppErrorKind::Validation); + assert_eq!(err.code, AppCode::Validation); + } + + #[test] + fn lock_not_available_carries_retry_hint() { + let db_err = DummyDbError { + message: "lock not available".into(), + code: Some("55P03".into()), + constraint: None, + table: None, + kind: SqlxErrorKind::Other + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!(err.retry.map(|r| r.after_seconds), Some(1)); + } + + #[test] + fn database_error_without_code() { + let db_err = DummyDbError { + message: "unknown error".into(), + code: None, + constraint: None, + table: None, + kind: SqlxErrorKind::Other + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!(err.kind, AppErrorKind::Database); + assert!(err.metadata().get("db.code").is_none()); + } + + #[test] + fn database_error_captures_table() { + let db_err = DummyDbError { + message: "error".into(), + code: None, + constraint: None, + table: Some("users".into()), + kind: SqlxErrorKind::Other + }; + let err: Error = SqlxError::Database(Box::new(db_err)).into(); + assert_eq!( + err.metadata().get("db.table"), + Some(&FieldValue::Str("users".into())) + ); + } } diff --git a/src/convert/validator.rs b/src/convert/validator.rs index 601d57c..fa0118c 100644 --- a/src/convert/validator.rs +++ b/src/convert/validator.rs @@ -124,6 +124,16 @@ mod tests { val: i32 } + #[derive(Validate)] + struct MultiField { + #[validate(length(min = 5))] + name: String, + #[validate(range(min = 0, max = 100))] + age: i32, + #[validate(email)] + email: String + } + #[test] fn validation_errors_map_to_validation_kind() { let bad = Payload { @@ -137,4 +147,131 @@ mod tests { Some(&FieldValue::U64(1)) ); } + + #[test] + fn multiple_field_errors_captured() { + let bad = MultiField { + name: "abc".into(), + age: -1, + email: "not-an-email".into() + }; + let validation_errors = bad.validate().unwrap_err(); + let err: Error = validation_errors.into(); + assert!(matches!(err.kind, AppErrorKind::Validation)); + let metadata = err.metadata(); + assert_eq!( + metadata.get("validation.field_count"), + Some(&FieldValue::U64(3)) + ); + assert_eq!( + metadata.get("validation.error_count"), + Some(&FieldValue::U64(3)) + ); + } + + #[test] + fn validation_fields_metadata_present() { + let bad = MultiField { + name: "ab".into(), + age: 200, + email: "bad".into() + }; + let validation_errors = bad.validate().unwrap_err(); + let err: Error = validation_errors.into(); + let metadata = err.metadata(); + let fields = metadata.get("validation.fields"); + assert!(fields.is_some()); + if let Some(FieldValue::Str(fields_str)) = fields { + assert!( + fields_str.contains("name") + || fields_str.contains("age") + || fields_str.contains("email") + ); + } + } + + #[test] + fn validation_codes_metadata_present() { + let bad = Payload { + val: -5 + }; + let validation_errors = bad.validate().unwrap_err(); + let err: Error = validation_errors.into(); + let metadata = err.metadata(); + assert!(metadata.get("validation.codes").is_some()); + } + + #[test] + fn error_preserves_source() { + let bad = Payload { + val: 0 + }; + let validation_errors = bad.validate().unwrap_err(); + let err: Error = validation_errors.into(); + assert!(err.source_ref().is_some()); + } + + #[test] + fn single_field_error_has_correct_count() { + let bad = Payload { + val: 0 + }; + let validation_errors = bad.validate().unwrap_err(); + let err: Error = validation_errors.into(); + let metadata = err.metadata(); + assert_eq!( + metadata.get("validation.error_count"), + Some(&FieldValue::U64(1)) + ); + } + + #[test] + fn fields_truncated_to_three() { + use validator::{ValidationError, ValidationErrors}; + let mut errors = ValidationErrors::new(); + errors.add("field1", ValidationError::new("required")); + errors.add("field2", ValidationError::new("required")); + errors.add("field3", ValidationError::new("required")); + errors.add("field4", ValidationError::new("required")); + let err: Error = errors.into(); + let metadata = err.metadata(); + if let Some(FieldValue::Str(fields)) = metadata.get("validation.fields") { + let count = fields.split(',').count(); + assert!(count <= 3); + } + } + + #[test] + fn codes_truncated_to_three() { + use validator::{ValidationError, ValidationErrors}; + let mut errors = ValidationErrors::new(); + let err1 = ValidationError::new("code1"); + let err2 = ValidationError::new("code2"); + let err3 = ValidationError::new("code3"); + let err4 = ValidationError::new("code4"); + errors.add("field1", err1); + errors.add("field2", err2); + errors.add("field3", err3); + errors.add("field4", err4); + let app_err: Error = errors.into(); + let metadata = app_err.metadata(); + if let Some(FieldValue::Str(codes)) = metadata.get("validation.codes") { + let count = codes.split(',').count(); + assert!(count <= 3); + } + } + + #[test] + fn duplicate_codes_filtered() { + use validator::{ValidationError, ValidationErrors}; + let mut errors = ValidationErrors::new(); + errors.add("field1", ValidationError::new("required")); + errors.add("field2", ValidationError::new("required")); + errors.add("field3", ValidationError::new("required")); + let err: Error = errors.into(); + let metadata = err.metadata(); + if let Some(FieldValue::Str(codes)) = metadata.get("validation.codes") { + assert_eq!(codes.as_ref(), "required"); + } + } } diff --git a/src/kind.rs b/src/kind.rs index 821dfc2..dbb865e 100644 --- a/src/kind.rs +++ b/src/kind.rs @@ -359,4 +359,116 @@ mod tests { let output = BadRequest.to_string(); assert!(output.contains("Bad request")); } + + #[test] + fn http_status_all_variants() { + assert_eq!(NotFound.http_status(), 404); + assert_eq!(Validation.http_status(), 422); + assert_eq!(Conflict.http_status(), 409); + assert_eq!(Unauthorized.http_status(), 401); + assert_eq!(Forbidden.http_status(), 403); + assert_eq!(NotImplemented.http_status(), 501); + assert_eq!(Internal.http_status(), 500); + assert_eq!(BadRequest.http_status(), 400); + assert_eq!(TelegramAuth.http_status(), 401); + assert_eq!(InvalidJwt.http_status(), 401); + assert_eq!(Database.http_status(), 500); + assert_eq!(Service.http_status(), 500); + assert_eq!(Config.http_status(), 500); + assert_eq!(Turnkey.http_status(), 500); + assert_eq!(Timeout.http_status(), 504); + assert_eq!(Network.http_status(), 503); + assert_eq!(RateLimited.http_status(), 429); + assert_eq!(DependencyUnavailable.http_status(), 503); + assert_eq!(Serialization.http_status(), 500); + assert_eq!(Deserialization.http_status(), 500); + assert_eq!(ExternalApi.http_status(), 500); + assert_eq!(Queue.http_status(), 500); + assert_eq!(Cache.http_status(), 500); + } + + #[test] + fn label_all_variants() { + assert_eq!(NotFound.label(), "Not found"); + assert_eq!(Validation.label(), "Validation error"); + assert_eq!(Conflict.label(), "Conflict"); + assert_eq!(Unauthorized.label(), "Unauthorized"); + assert_eq!(Forbidden.label(), "Forbidden"); + assert_eq!(NotImplemented.label(), "Not implemented"); + assert_eq!(Internal.label(), "Internal server error"); + assert_eq!(BadRequest.label(), "Bad request"); + assert_eq!(TelegramAuth.label(), "Telegram authentication error"); + assert_eq!(InvalidJwt.label(), "Invalid JWT"); + assert_eq!(Database.label(), "Database error"); + assert_eq!(Service.label(), "Service error"); + assert_eq!(Config.label(), "Configuration error"); + assert_eq!(Turnkey.label(), "Turnkey error"); + assert_eq!(Timeout.label(), "Operation timed out"); + assert_eq!(Network.label(), "Network error"); + assert_eq!(RateLimited.label(), "Rate limit exceeded"); + assert_eq!( + DependencyUnavailable.label(), + "External dependency unavailable" + ); + assert_eq!(Serialization.label(), "Serialization error"); + assert_eq!(Deserialization.label(), "Deserialization error"); + assert_eq!(ExternalApi.label(), "External API error"); + assert_eq!(Queue.label(), "Queue processing error"); + assert_eq!(Cache.label(), "Cache error"); + } + + #[test] + fn display_all_variants() { + assert_eq!(NotFound.to_string(), NotFound.label()); + assert_eq!(Validation.to_string(), Validation.label()); + assert_eq!(Conflict.to_string(), Conflict.label()); + assert_eq!(Unauthorized.to_string(), Unauthorized.label()); + assert_eq!(Forbidden.to_string(), Forbidden.label()); + assert_eq!(NotImplemented.to_string(), NotImplemented.label()); + assert_eq!(Internal.to_string(), Internal.label()); + assert_eq!(BadRequest.to_string(), BadRequest.label()); + assert_eq!(TelegramAuth.to_string(), TelegramAuth.label()); + assert_eq!(InvalidJwt.to_string(), InvalidJwt.label()); + assert_eq!(Database.to_string(), Database.label()); + assert_eq!(Service.to_string(), Service.label()); + assert_eq!(Config.to_string(), Config.label()); + assert_eq!(Turnkey.to_string(), Turnkey.label()); + assert_eq!(Timeout.to_string(), Timeout.label()); + assert_eq!(Network.to_string(), Network.label()); + assert_eq!(RateLimited.to_string(), RateLimited.label()); + assert_eq!( + DependencyUnavailable.to_string(), + DependencyUnavailable.label() + ); + assert_eq!(Serialization.to_string(), Serialization.label()); + assert_eq!(Deserialization.to_string(), Deserialization.label()); + assert_eq!(ExternalApi.to_string(), ExternalApi.label()); + assert_eq!(Queue.to_string(), Queue.label()); + assert_eq!(Cache.to_string(), Cache.label()); + } + + #[test] + fn error_trait_impl() { + use core::error::Error; + let kind = Internal; + let err: &dyn Error = &kind; + assert!(err.source().is_none()); + } + + #[test] + fn clone_and_copy() { + let kind1 = Internal; + let kind2 = kind1; + let kind3 = kind1; + assert_eq!(kind1, kind2); + assert_eq!(kind2, kind3); + } + + #[test] + fn debug_format() { + let debug_str = format!("{:?}", Internal); + assert_eq!(debug_str, "Internal"); + let debug_str = format!("{:?}", NotFound); + assert_eq!(debug_str, "NotFound"); + } } diff --git a/src/response/tests.rs b/src/response/tests.rs index 94d00f9..eae263a 100644 --- a/src/response/tests.rs +++ b/src/response/tests.rs @@ -730,3 +730,171 @@ fn from_borrowed_app_error_redacts_message() { assert!(!resp.message.contains("secret123")); assert_eq!(err.message.as_deref(), Some("database password: secret123")); } + +// --- ProblemJson tests ------------------------------------------------------- + +#[test] +fn problem_json_from_error_response_empty_message() { + let resp = ErrorResponse::new(500, AppCode::Internal, "").expect("status"); + let problem = ProblemJson::from_error_response(resp); + assert!(problem.detail.is_none()); +} + +#[test] +fn problem_json_from_error_response_with_message() { + let resp = ErrorResponse::new(404, AppCode::NotFound, "user not found").expect("status"); + let problem = ProblemJson::from_error_response(resp); + assert_eq!(problem.detail.as_deref(), Some("user not found")); +} + +#[test] +fn problem_json_status_code_valid() { + let problem = ProblemJson::from_app_error(AppError::not_found("missing")); + assert_eq!(problem.status_code(), http::StatusCode::NOT_FOUND); +} + +#[test] +fn problem_json_grpc_code() { + let problem = ProblemJson::from_app_error(AppError::not_found("missing")); + assert!(problem.grpc.is_some()); + let grpc = problem.grpc.unwrap(); + assert_eq!(grpc.name, "NOT_FOUND"); + assert_eq!(grpc.value, 5); +} + +#[test] +fn problem_json_type_uri() { + let problem = ProblemJson::from_app_error(AppError::not_found("missing")); + assert!(problem.type_uri.is_some()); + assert!(problem.type_uri.unwrap().contains("not-found")); +} + +#[test] +fn problem_json_with_metadata() { + use crate::field; + let err = AppError::service("failed").with_field(field::u64("attempt", 3)); + let problem = ProblemJson::from_app_error(err); + assert!(problem.metadata.is_some()); +} + +#[test] +fn problem_json_with_redacted_metadata() { + use crate::field; + let err = AppError::internal("error") + .with_field(field::str("password", "secret")) + .with_field(field::str("user", "john")); + let problem = ProblemJson::from_app_error(err); + assert!(problem.metadata.is_some()); +} + +#[test] +fn problem_json_redacts_metadata_when_redactable() { + use crate::field; + let err = AppError::internal("error") + .with_field(field::str("data", "value")) + .redactable(); + let problem = ProblemJson::from_app_error(err); + assert!(problem.metadata.is_none()); + assert!(problem.detail.is_none()); +} + +#[test] +fn problem_json_from_ref_with_retry() { + let err = AppError::rate_limited("slow down").with_retry_after_secs(60); + let problem = ProblemJson::from_ref(&err); + assert_eq!(problem.retry_after, Some(60)); +} + +#[test] +fn problem_json_from_ref_with_www_authenticate() { + let err = AppError::unauthorized("need auth").with_www_authenticate("Bearer"); + let problem = ProblemJson::from_ref(&err); + assert_eq!(problem.www_authenticate.as_deref(), Some("Bearer")); +} + +#[test] +fn problem_json_metadata_hash_redaction() { + use crate::field; + let mut err = AppError::service("test"); + err = err.with_field(field::str("api_token", "secret_token_value")); + let problem = ProblemJson::from_app_error(err); + let metadata = problem.metadata.expect("metadata"); + let serialized = serde_json::to_string(&metadata).expect("serialize"); + assert!(!serialized.contains("secret_token_value")); +} + +#[test] +fn problem_json_metadata_last4_redaction() { + use crate::field; + let err = AppError::service("test").with_field(field::str("card_number", "4111111111111111")); + let problem = ProblemJson::from_app_error(err); + let metadata = problem.metadata.expect("metadata"); + let serialized = serde_json::to_string(&metadata).expect("serialize"); + assert!(serialized.contains("1111")); + assert!(!serialized.contains("4111111111111111")); +} + +#[test] +fn problem_json_internal_formatter() { + let problem = ProblemJson::from_app_error(AppError::not_found("user")); + let internal = problem.internal(); + let debug = format!("{:?}", internal); + assert!(debug.contains("ProblemJson")); +} + +#[test] +fn problem_metadata_value_from_field_value() { + use std::{borrow::Cow, net::IpAddr, time::Duration}; + + use uuid::Uuid; + + use crate::{FieldValue, ProblemMetadataValue}; + + let str_val = ProblemMetadataValue::from(FieldValue::Str(Cow::Borrowed("test"))); + assert!(matches!(str_val, ProblemMetadataValue::String(_))); + + let i64_val = ProblemMetadataValue::from(FieldValue::I64(-42)); + assert!(matches!(i64_val, ProblemMetadataValue::I64(-42))); + + let u64_val = ProblemMetadataValue::from(FieldValue::U64(100)); + assert!(matches!(u64_val, ProblemMetadataValue::U64(100))); + + let f64_val = ProblemMetadataValue::from(FieldValue::F64(1.5)); + assert!(matches!(f64_val, ProblemMetadataValue::F64(_))); + + let bool_val = ProblemMetadataValue::from(FieldValue::Bool(true)); + assert!(matches!(bool_val, ProblemMetadataValue::Bool(true))); + + let uuid = Uuid::nil(); + let uuid_val = ProblemMetadataValue::from(FieldValue::Uuid(uuid)); + assert!(matches!(uuid_val, ProblemMetadataValue::String(_))); + + let dur_val = ProblemMetadataValue::from(FieldValue::Duration(Duration::from_secs(5))); + assert!(matches!(dur_val, ProblemMetadataValue::Duration { .. })); + + let ip: IpAddr = "127.0.0.1".parse().unwrap(); + let ip_val = ProblemMetadataValue::from(FieldValue::Ip(ip)); + assert!(matches!(ip_val, ProblemMetadataValue::Ip(_))); +} + +#[cfg(feature = "serde_json")] +#[test] +fn problem_metadata_value_from_json() { + use serde_json::json; + + use crate::{FieldValue, ProblemMetadataValue}; + + let json_val = ProblemMetadataValue::from(FieldValue::Json(json!({"key": "value"}))); + assert!(matches!(json_val, ProblemMetadataValue::Json(_))); +} + +#[test] +fn code_mapping_accessors() { + use crate::mapping_for_code; + let mapping = mapping_for_code(&AppCode::NotFound); + assert_eq!(mapping.http_status(), 404); + assert_eq!(mapping.kind(), AppErrorKind::NotFound); + assert!(mapping.problem_type().contains("not-found")); + let grpc = mapping.grpc(); + assert_eq!(grpc.name, "NOT_FOUND"); +} diff --git a/src/result_ext.rs b/src/result_ext.rs index afe9b65..638eeee 100644 --- a/src/result_ext.rs +++ b/src/result_ext.rs @@ -312,4 +312,64 @@ mod tests { assert_eq!(source.kind, AppErrorKind::BadRequest); assert_eq!(source.message.as_deref(), Some("missing flag")); } + + #[test] + fn context_with_owned_string() { + let result: Result<(), DummyError> = Err(DummyError); + let err = result + .context(String::from("owned message")) + .expect_err("err"); + assert_eq!(err.message.as_deref(), Some("owned message")); + } + + #[test] + fn context_preserves_www_authenticate() { + let base = Error::unauthorized("need auth").with_www_authenticate("Bearer realm=\"api\""); + let err = Result::<(), Error>::Err(base) + .context("auth context") + .expect_err("err"); + assert_eq!( + err.www_authenticate.as_deref(), + Some("Bearer realm=\"api\"") + ); + } + + #[test] + fn context_preserves_retry() { + let base = Error::service("retry later").with_retry_after_secs(30); + let err = Result::<(), Error>::Err(base) + .context("wrapped") + .expect_err("err"); + assert!(err.retry.is_some()); + assert_eq!(err.retry.unwrap().after_seconds, 30); + } + + #[cfg(feature = "serde_json")] + #[test] + fn context_preserves_details() { + let base = Error::internal("error").with_details_json(serde_json::json!({"key": "value"})); + let err = Result::<(), Error>::Err(base) + .context("wrapped") + .expect_err("err"); + assert!(err.details.is_some()); + } + + #[test] + fn ctx_with_custom_code() { + let result: Result<(), DummyError> = Err(DummyError); + let err = result + .ctx(|| Context::new(AppErrorKind::NotFound).code(AppCode::NotFound)) + .expect_err("err"); + assert_eq!(err.kind, AppErrorKind::NotFound); + assert_eq!(err.code, AppCode::NotFound); + } + + #[test] + fn ctx_with_category_change() { + let result: Result<(), DummyError> = Err(DummyError); + let err = result + .ctx(|| Context::new(AppErrorKind::Internal).category(AppErrorKind::Service)) + .expect_err("err"); + assert_eq!(err.kind, AppErrorKind::Service); + } }