Files
Unlucky-Launcher/crates/cli/src/os.rs
T
AskaEth bc41dfcf7d
CI / fmt (rustfmt --check) (push) Canceled after 0s
CI / clippy (ubuntu-latest) (push) Canceled after 0s
CI / clippy (windows-latest) (push) Canceled after 0s
CI / test (ubuntu-latest) (push) Canceled after 0s
CI / test (windows-latest) (push) Canceled after 0s
CI / build release (ubuntu-latest) (push) Canceled after 0s
CI / build release (windows-latest) (push) Canceled after 0s
Guards / core 零 UI 守门 (push) Canceled after 0s
Guards / 文件行数 ≤400 守门 (push) Canceled after 0s
Guards / 依赖许可与来源(cargo-deny) (push) Canceled after 0s
Unlucky Launcher v0.0.1-alpha
Rust 原生单文件 Minecraft 启动器:CLI 完整可用(install/launch/accounts/java/diagnose/agent),
MCP server 接入外部 Agent 工具,GUI 开发中。
2026-10-31 21:54:10 +08:00

79 lines
2.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 系统摘要与启动自检的 **CLI 呈现层**(D19 探测 + D21 Win10+ 单基线)。
//!
//! 事实采集与等级判定全在 `unlucky_core::platform::os_info`(M20):
//! - [`os_info::detect`] 真探一次(会起子进程,别在热路径反复调用);
//! - [`os_info::current`] 进程内缓存(CLI 每次执行只真探一次);
//! - [`os_info::check`] 启动自检(等级 + 双语文案 + 系统信息)。
//!
//! 本模块只做 CLI 关心的事:一行摘要、`--json` 对象、拒绝运行时的文案。
//! 支持级别只有两档(D21 用户拍板「直接 win10 起步」):[`SupportLevel::One`] 与
//! [`SupportLevel::Unsupported`]——Win8.1/8/7 不承诺 GUI 也不承诺 CLI,
//! 识别出旧版本正是为了明确报「不支持」。
use serde_json::{json, Value};
use unlucky_core::platform::os_info::{self, OsInfo, SupportLevel};
/// 取进程内缓存的系统信息(一次进程只真探一次)。
#[must_use]
pub fn detect() -> OsInfo {
os_info::current().clone()
}
/// 启动自检(等级 + 双语文案 + 系统信息),供拒绝运行时直接打印。
#[must_use]
pub fn check() -> os_info::SupportCheck {
os_info::check()
}
/// 一行摘要(`ull --version` 附带)。
#[must_use]
pub fn summary_line(info: &OsInfo) -> String {
let version = if info.version_string.is_empty() {
"版本未知"
} else {
info.version_string.as_str()
};
format!(
"{} · {}({})· {}",
info.product,
version,
info.arch,
support_label(info.support_level)
)
}
/// `--json` 里的系统对象。
#[must_use]
pub fn to_json(info: &OsInfo) -> Value {
json!({
"family": info.family.manifest_name(),
"product": info.product,
"version": if info.version_string.is_empty() { None } else { Some(&info.version_string) },
"major_minor": info.major_minor.map(|(major, minor)| format!("{major}.{minor}")),
"build": info.build,
"arch": info.arch,
"session": info.session.as_str(),
"support": info.support_level.as_str(),
"baseline": BASELINE,
})
}
/// 支持基线的一句话(`--json` 与帮助文案共用)。
pub const BASELINE: &str = "Windows 10+ / macOS 12+ / Linux(内核 ≥ 3.2,glibc ≥ 2.17)";
/// 环境级提示:仅在低于基线时非空(一等基线不打岔)。
#[must_use]
pub fn notes(info: &OsInfo) -> Vec<String> {
match info.support_level {
SupportLevel::One => Vec::new(),
SupportLevel::Unsupported => info.describe().zh.lines().map(str::to_string).collect(),
}
}
fn support_label(level: SupportLevel) -> &'static str {
match level {
SupportLevel::One => "满足最低要求",
SupportLevel::Unsupported => "不支持(低于最低要求)",
}
}