ek-station 0.4.13

Station for the ek ecosystem: headless plugin host bootstrap - assembles ek-core MainEngine from a compile-time plugin factory table, runs the svctl supervisor service (list/start/remove over bus ask) and a headless main (readiness marker + graceful close).
Documentation
//! pickfile(Launcher↔bin 共享清单地面)round-trip 与严格规则。

use std::path::Path;

use ek_station::pickfile::{PickListErr, read, write_in};

#[test]
fn p0_roundtrip_and_filter() {
    let dir = std::env::temp_dir().join(format!("ek-station-pick-{}", std::process::id()));
    let written = write_in(&dir, &["dm", "oms", "ui"]).unwrap();
    assert_eq!(read(&written).unwrap(), vec!["dm", "oms", "ui"]);
}

#[test]
fn p1_strict_reader_rules() {
    let dir = std::env::temp_dir().join(format!("ek-station-pick-bad-{}", std::process::id()));
    std::fs::create_dir_all(&dir).unwrap();
    let path = dir.join("bad.list");
    std::fs::write(&path, "# c\n\ndm\n a b\noms\n").unwrap();
    assert!(matches!(read(&path), Err(PickListErr::BadLine(4, _))));
    let empty = dir.join("empty.list");
    std::fs::write(&empty, "  \n# only\n\n").unwrap();
    assert_eq!(read(&empty), Err(PickListErr::Empty));
}

#[test]
fn p2_strict_writer_rules() {
    let dir =
        Path::new(&std::env::temp_dir()).join(format!("ek-station-pick-w-{}", std::process::id()));
    assert_eq!(write_in(&dir, &[]), Err(PickListErr::Empty));
    assert!(write_in(&dir, &["dm oms"]).is_err());
    let path = write_in(&dir, &["dm"]).unwrap();
    assert!(read(&path).unwrap() == vec!["dm"]);
}

#[test]
fn p3_bom_tolerated() {
    // Notepad 系 UTF-8 BOM:编码叙文剥离,首行注释照常是注释(0.1.2 审计修正)。
    let dir = std::env::temp_dir().join(format!("ek-station-pick-bom-{}", std::process::id()));
    std::fs::create_dir_all(&dir).unwrap();
    let path = dir.join("bom.list");
    std::fs::write(&path, "\u{feff}# c\ndm\noms\n").unwrap();
    assert_eq!(read(&path).unwrap(), vec!["dm", "oms"]);
}