Skip to main content

browser_automation_cli/i18n/
mensagem.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2//! Typed human-facing message keys (`Mensagem`) with exhaustive per-locale match.
3
4use super::idioma::Idioma;
5
6/// Stable FTL / catalog id for a [`Mensagem`] variant.
7pub fn ftl_id(msg: Mensagem) -> &'static str {
8    match msg {
9        Mensagem::UsageSuggestion => "usage-suggestion",
10        Mensagem::BrokenPipeSuggestion => "broken-pipe-suggestion",
11        Mensagem::UnavailableSuggestion => "unavailable-suggestion",
12        Mensagem::DataSuggestion => "data-suggestion",
13        Mensagem::BrowserSuggestion => "browser-suggestion",
14        Mensagem::VisionRequired => "vision-required",
15        Mensagem::RobotsDual => "robots-dual",
16        Mensagem::CategoryMemory => "category-memory",
17        Mensagem::CategoryExtensions => "category-extensions",
18        Mensagem::ScreencastFlag => "screencast-flag",
19        Mensagem::WebmcpFlag => "webmcp-flag",
20        Mensagem::ThirdPartyFlag => "third-party-flag",
21        Mensagem::CaptureNetwork => "capture-network",
22        Mensagem::CaptureConsole => "capture-console",
23        Mensagem::RunFailFast => "run-fail-fast",
24        Mensagem::LighthouseMissing => "lighthouse-missing",
25        Mensagem::LocaleResolved => "locale-resolved",
26        Mensagem::LocaleSource => "locale-source",
27    }
28}
29
30/// Every human-facing UI string key for this binary.
31///
32/// Technical `error.message` fields and tracing targets stay English literals
33/// outside this enum (agent contract). Variants are named in English.
34#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
35#[non_exhaustive]
36pub enum Mensagem {
37    /// Usage / argv errors — human suggestion.
38    UsageSuggestion,
39    /// Broken pipe (exit 141) — human suggestion.
40    BrokenPipeSuggestion,
41    /// Chrome unavailable — human suggestion.
42    UnavailableSuggestion,
43    /// Data / robots / payload — human suggestion.
44    DataSuggestion,
45    /// Browser session failure — human suggestion.
46    BrowserSuggestion,
47    /// Vision experimental flag required.
48    VisionRequired,
49    /// Dual robots ignore flags required.
50    RobotsDual,
51    /// Memory category flag required.
52    CategoryMemory,
53    /// Extensions category flag required.
54    CategoryExtensions,
55    /// Screencast experimental flag required.
56    ScreencastFlag,
57    /// WebMCP category flag required.
58    WebmcpFlag,
59    /// Third-party category flag required.
60    ThirdPartyFlag,
61    /// Network capture flag required before net tools.
62    CaptureNetwork,
63    /// Console capture flag required before console tools.
64    CaptureConsole,
65    /// Run script failed fast.
66    RunFailFast,
67    /// Lighthouse binary missing.
68    LighthouseMissing,
69    /// `locale` subcommand: resolved label.
70    LocaleResolved,
71    /// `locale` subcommand: source label.
72    LocaleSource,
73}
74
75impl Mensagem {
76    /// All variants (for parity / exhaustiveness tests).
77    pub const ALL: &'static [Mensagem] = &[
78        Mensagem::UsageSuggestion,
79        Mensagem::BrokenPipeSuggestion,
80        Mensagem::UnavailableSuggestion,
81        Mensagem::DataSuggestion,
82        Mensagem::BrowserSuggestion,
83        Mensagem::VisionRequired,
84        Mensagem::RobotsDual,
85        Mensagem::CategoryMemory,
86        Mensagem::CategoryExtensions,
87        Mensagem::ScreencastFlag,
88        Mensagem::WebmcpFlag,
89        Mensagem::ThirdPartyFlag,
90        Mensagem::CaptureNetwork,
91        Mensagem::CaptureConsole,
92        Mensagem::RunFailFast,
93        Mensagem::LighthouseMissing,
94        Mensagem::LocaleResolved,
95        Mensagem::LocaleSource,
96    ];
97
98    /// Resolve text for an explicit idioma (no process global). Preferred in tests.
99    pub fn texto(self, idioma: Idioma) -> &'static str {
100        match idioma {
101            Idioma::En => super::en::texto(self),
102            Idioma::PtBr => super::pt_br::texto(self),
103        }
104    }
105
106    /// Map a legacy suggestion catalog key to a message (or usage fallback).
107    pub fn from_suggestion_key(key: &str) -> Mensagem {
108        match key {
109            "vision_required" => Mensagem::VisionRequired,
110            "robots_dual" => Mensagem::RobotsDual,
111            "category_memory" => Mensagem::CategoryMemory,
112            "category_extensions" => Mensagem::CategoryExtensions,
113            "screencast_flag" => Mensagem::ScreencastFlag,
114            "webmcp_flag" => Mensagem::WebmcpFlag,
115            "third_party_flag" => Mensagem::ThirdPartyFlag,
116            "capture_network" => Mensagem::CaptureNetwork,
117            "capture_console" => Mensagem::CaptureConsole,
118            "run_fail_fast" => Mensagem::RunFailFast,
119            "lighthouse_missing" => Mensagem::LighthouseMissing,
120            _ => Mensagem::UsageSuggestion,
121        }
122    }
123
124    /// Map error kind string to a human suggestion message.
125    pub fn from_error_kind(kind: &str) -> Option<Mensagem> {
126        match kind {
127            "usage" => Some(Mensagem::UsageSuggestion),
128            "broken-pipe" => Some(Mensagem::BrokenPipeSuggestion),
129            "unavailable" => Some(Mensagem::UnavailableSuggestion),
130            "data" => Some(Mensagem::DataSuggestion),
131            "browser" => Some(Mensagem::BrowserSuggestion),
132            _ => None,
133        }
134    }
135}