البناء
شاشات من React
صمّم الشاشات بـ React و TSX، ودع Screen Compiler يحوّلها إلى Rust أصلية لـ NoWayOS وقت البناء: المجموعة الجزئية المدعومة، والأوامر، ولماذا يرفض بدلًا من أن يخمّن.
لا يحوي NoWayOS متصفحًا، ولن يحويه أبدًا: فهذا هو المقصود. لكن المصممين ومطوري الواجهات الأمامية يستطيعون الاحتفاظ بأدواتهم. يحوّل Screen Compiler شاشات React، المكتوبة بـ TSX ضمن مجموعة جزئية مُعلنة، إلى Rust لبيئة تشغيل واجهة المستخدم في NoWayOS. ويعمل وقت البناء، على جهازك أو في التكامل المستمر (CI)، ولا يُشحن أبدًا إلى الجهاز.
من هذا
export function WelcomeScreen({ onStart, onHelp }: WelcomeProps) {
return (
<Screen>
<Column gap={SPACE_SM} padding={SPACE_LG}>
<Text id="title">Welcome</Text>
<Text>Touch Start to begin.</Text>
<Spacer />
<Button id="start" onPress={onStart}>Start</Button>
<Button onPress={onHelp}>Help & accessibility</Button>
</Column>
</Screen>
);
}
إلى هذا
pub fn build<B: ui::UiBuilder>(b: &mut B) -> Result<Nodes<B::Node>, B::Error> {
let n1 = b.text("Welcome")?; // welcome.tsx:17:9 <Text>
let n2 = b.text("Touch Start to begin.")?; // welcome.tsx:18:9 <Text>
let n4 = b.spacer(None)?; // welcome.tsx:20:9 <Spacer>
let n5 = b.button("Start", actions::START)?; // welcome.tsx:21:9 <Button>
let n6 = b.button("Help & accessibility", actions::HELP)?; // welcome.tsx:24:9 <Button>
let n0 = b.column(ui::Layout::new().gap(super::tokens::SPACE_SM).padding(super::tokens::SPACE_LG), &[n1, n2, n4, n5, n6])?; // welcome.tsx:16:7 <Column>
Ok(Nodes { root: n0, title: n1, start: n5 })
}
تشير كل عقدة إلى سطر وعمود TSX الذي جاءت منه. ثم يرسم مُصيِّر NoWayOS الشاشة المحوّلة، ويجب أن تطابق صورتها المعتمدة، بكسلًا ببكسل. (مختصرة من الملف fixtures/welcome.tsx في المستودع وشيفرة Rust المولّدة منه.)
ما الذي يحوّله
الشاشات المبنية من عُدّة Screen Compiler: Screen و Column و Row و Text و Button و TextInput و Checkbox و RadioGroup و Spacer و Card و Notice و HeaderBar و ProgressBar و Icon. وكذلك رموز التصميم بوصفها ثوابت، وخصائص الاستدعاء الراجع (callback props) التي تصبح إجراءات، والنص الذي يضبطه التطبيق وقت التشغيل، والأجزاء التي يُظهرها التطبيق أو يخفيها ({cond && <X/>}).
بدقة أو لا شيء. كل ما يقع خارج المجموعة الجزئية يُرفض، مع ذكر الملف والسطر والعمود، ولا يُقرَّب أبدًا. والشاشة نفسها تعطي شيفرة Rust متطابقة بايتًا ببايت على أي جهاز. ولا تحوي الشيفرة المولّدة unsafe ولا unwrap ولا panic.
جرّبه
تأتي حاوية تطوير Screen Compiler وفحص العقد الخاص به من NoWayOS، لذا استنسخ الاثنين جنبًا إلى جنب:
mkdir nowayos-work && cd nowayos-work
git clone https://github.com/NoWayOS/nowayos.git
git clone https://github.com/NoWayOS/screen-compiler.git screen-compiler
make -C nowayos container # the dev image, once
cd screen-compiler
make test # unit, property, snapshot and command-line tests
make run ARGS="check fixtures/welcome.tsx" # check one screen against the subset
make contract-check # build every screen against NoWayOS's UI, and draw it
الصور المعتمدة
لكل شاشة محوّلة صورة معتمدة. وحين يغيّر تعديلٌ على شاشة، أو على التخطيط أو الرسم في NoWayOS، مظهرَها، أعد رسم الصور بالأمر make bless-images في screen-compiler. ويطّلع شخص على كل صورة ويعتمدها قبل إيداعها. ومن جهة nowayos، يُظهر make screen-compiler-check الصور المعتمدة التي قد يغيّرها تعديلٌ ما.
لا تستخدمه إلا على شاشاتك أنت
Screen Compiler أداة بناء، لا بيئة معزولة. حوّل شيفرة TSX التي تثق بها، كما تُصرّف الشيفرة التي تثق بها.
الترخيص
Screen Compiler مرخص بموجب MIT. وشيفرة Rust التي يولّدها من شاشاتك ملك لك، ترخّصها كما تشاء.