ppc login works in mme main
This commit is contained in:
32
parts/mize.dev/docker/base/Dockerfile
Normal file
32
parts/mize.dev/docker/base/Dockerfile
Normal file
@@ -0,0 +1,32 @@
|
||||
FROM rust:1.95.0
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y \
|
||||
mingw-w64 \
|
||||
build-essential \
|
||||
gcc-arm-linux-gnueabi \
|
||||
g++-arm-linux-gnueabi
|
||||
|
||||
RUN apt-get install -y \
|
||||
clang \
|
||||
lld \
|
||||
llvm
|
||||
|
||||
# Rust cross-compilation targets
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 x86_64-pc-windows-gnu
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 aarch64-pc-windows-gnullvm
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 x86_64-unknown-linux-gnu
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 aarch64-unknown-linux-gnu
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 armv7-unknown-linux-gnueabihf
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 arm-unknown-linux-gnueabi
|
||||
|
||||
# Set default Rust toolchain
|
||||
RUN rustup default nightly-2026-01-30
|
||||
|
||||
WORKDIR /src
|
||||
8
parts/mize.dev/docker/darwin/Dockerfile
Normal file
8
parts/mize.dev/docker/darwin/Dockerfile
Normal file
@@ -0,0 +1,8 @@
|
||||
FROM joseluisq/rust-linux-darwin-builder:2.0.0-beta.1
|
||||
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 x86_64-apple-darwin
|
||||
RUN rustup target add --toolchain nightly-2026-01-30 aarch64-apple-darwin
|
||||
|
||||
RUN rustup default nightly-2026-01-30
|
||||
|
||||
WORKDIR /src
|
||||
@@ -4,7 +4,8 @@
|
||||
//! a Rust source file that looks like the hand-written `generated.rs`.
|
||||
|
||||
use mize::prelude::*;
|
||||
use mize::instance::{PartMetadata, MethodMetadata, OptMetadata, NativeMetadata};
|
||||
use mize::instance::{PartMetadata, MethodMetadata, OptMetadata, NativeMetadata, parse_method_signature};
|
||||
use std::collections::HashSet;
|
||||
use std::fmt::Write as _;
|
||||
|
||||
/// Convert a part name like "cli" into a PascalCase struct name like "CliPart".
|
||||
@@ -31,7 +32,8 @@ fn part_name_to_struct(part_name: &str) -> String {
|
||||
pub fn generate_lib_rs(all_metadata: &[PartMetadata]) -> String {
|
||||
let mut out = String::new();
|
||||
out.push_str("// AUTO-GENERATED by mize dev gen -- do not edit manually\n");
|
||||
out.push_str("use mize::prelude::*;\n\n\n");
|
||||
out.push_str("use mize::prelude::*;\n");
|
||||
out.push_str("use mize::config::MizeFun;\n\n\n");
|
||||
|
||||
for meta in all_metadata {
|
||||
generate_part_struct(&mut out, meta);
|
||||
@@ -40,9 +42,28 @@ pub fn generate_lib_rs(all_metadata: &[PartMetadata]) -> String {
|
||||
out
|
||||
}
|
||||
|
||||
fn native_names(meta: &PartMetadata) -> HashSet<String> {
|
||||
meta.natives.iter().map(|n| n.name.clone()).collect()
|
||||
}
|
||||
|
||||
fn native_fn_names(meta: &PartMetadata) -> HashSet<String> {
|
||||
let mut names = HashSet::new();
|
||||
for n in &meta.natives {
|
||||
for a in &n.associated {
|
||||
names.insert(a.clone());
|
||||
}
|
||||
for m in &n.methods {
|
||||
names.insert(m.clone());
|
||||
}
|
||||
}
|
||||
names
|
||||
}
|
||||
|
||||
fn generate_part_struct(out: &mut String, meta: &PartMetadata) {
|
||||
let struct_name = part_name_to_struct(&meta.part_name);
|
||||
let part_id_str = meta.part_name.replace('.', ".");
|
||||
let natives = native_names(meta);
|
||||
let native_fns = native_fn_names(meta);
|
||||
|
||||
// struct definition
|
||||
let _ = writeln!(out, "pub struct {struct_name} {{");
|
||||
@@ -52,8 +73,8 @@ fn generate_part_struct(out: &mut String, meta: &PartMetadata) {
|
||||
|
||||
// MizePart impl
|
||||
let _ = writeln!(out, "impl MizePart for {struct_name} {{");
|
||||
let _ = writeln!(out, " fn id(&self) -> MizeId {{");
|
||||
let _ = writeln!(out, " self.id.clone()");
|
||||
let _ = writeln!(out, " fn id(&self) -> MizeResult<MizeId> {{");
|
||||
let _ = writeln!(out, " Ok(self.id.clone())");
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out, "}}");
|
||||
let _ = writeln!(out);
|
||||
@@ -65,16 +86,23 @@ fn generate_part_struct(out: &mut String, meta: &PartMetadata) {
|
||||
let _ = writeln!(out, " pub fn get(name: &str) -> MizeResult<{struct_name}> {{");
|
||||
let _ = writeln!(out, " let mut mize = get_global_mize()?;");
|
||||
let _ = writeln!(out, " let part = mize.get_part(name)?;");
|
||||
let _ = writeln!(out, " Ok({struct_name} {{ id: part.id() }})");
|
||||
let _ = writeln!(out, " Ok({struct_name} {{ id: part.id()? }})");
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out);
|
||||
|
||||
// one method per recorded method/effect/thread
|
||||
// part methods (skip ones that belong to include_native)
|
||||
for m in meta.methods.iter().chain(meta.effects.iter()).chain(meta.threads.iter()) {
|
||||
generate_method_fn(out, &struct_name, m);
|
||||
if native_fns.contains(&m.name) {
|
||||
continue;
|
||||
}
|
||||
generate_typed_method_fn(out, &struct_name, m);
|
||||
}
|
||||
|
||||
// one getter-ish fn per recorded opt (opts are config values; expose a dyn_call getter)
|
||||
// opts that are not natives
|
||||
for o in &meta.opts {
|
||||
if natives.contains(&o.name) || o.name.starts_with('_') {
|
||||
continue;
|
||||
}
|
||||
generate_opt_fn(out, &struct_name, o);
|
||||
}
|
||||
|
||||
@@ -83,22 +111,143 @@ fn generate_part_struct(out: &mut String, meta: &PartMetadata) {
|
||||
|
||||
// native type wrappers
|
||||
for n in &meta.natives {
|
||||
generate_native_struct(out, n);
|
||||
generate_native_struct(out, &meta.part_name, n);
|
||||
}
|
||||
|
||||
let _ = writeln!(out, "// part id string: {part_id_str}");
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
|
||||
fn generate_method_fn(out: &mut String, _struct_name: &str, m: &MethodMetadata) {
|
||||
/// Map a signature type name to a Rust parameter type for generated bindings.
|
||||
fn rust_param_type(type_name: &str) -> String {
|
||||
match type_name {
|
||||
"String" => "&str".to_string(),
|
||||
"u32" => "u32".to_string(),
|
||||
"Vec<String>" => "Vec<String>".to_string(),
|
||||
"Func" => "MizeFun".to_string(),
|
||||
"()" => "()".to_string(),
|
||||
other => other.to_string(), // native wrapper type
|
||||
}
|
||||
}
|
||||
|
||||
fn is_native_type(type_name: &str) -> bool {
|
||||
!matches!(
|
||||
type_name,
|
||||
"String" | "u32" | "Vec<String>" | "Func" | "()" | "ItemData" | ""
|
||||
)
|
||||
}
|
||||
|
||||
/// Emit packing of one typed arg into `args` at path index `i`.
|
||||
fn emit_arg_pack(out: &mut String, i: usize, type_name: &str, param_name: &str) {
|
||||
match type_name {
|
||||
"String" => {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" args.set_path(\"{i}\", {param_name}.into_item_data())?;"
|
||||
);
|
||||
}
|
||||
"u32" => {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" args.set_path(\"{i}\", {param_name}.into_item_data())?;"
|
||||
);
|
||||
}
|
||||
"Vec<String>" => {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" args.set_path(\"{i}\", {param_name}.into_item_data())?;"
|
||||
);
|
||||
}
|
||||
"Func" => {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" args.set_path(\"{i}\", ItemData::fun({param_name})?)?;"
|
||||
);
|
||||
}
|
||||
_ if is_native_type(type_name) => {
|
||||
let _ = writeln!(out, " let mut __arg{i} = ItemData::new();");
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" __arg{i}.set_path(\"_native\", {param_name}.native_num)?;"
|
||||
);
|
||||
let _ = writeln!(out, " args.set_path(\"{i}\", __arg{i})?;");
|
||||
}
|
||||
_ => {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" args.set_path(\"{i}\", {param_name}.into_item_data())?;"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_typed_method_fn(
|
||||
out: &mut String,
|
||||
_struct_name: &str,
|
||||
m: &MethodMetadata,
|
||||
) {
|
||||
let fn_name = &m.name;
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}(&self, args: ItemData) -> MizeResult<ItemData> {{"
|
||||
);
|
||||
let _ = writeln!(out, " dyn_call(self.id.clone(), \"{fn_name}\", args)?;");
|
||||
// note: dyn_call returns ItemData already, so wrap:
|
||||
let _ = writeln!(out, " dyn_call(self.id.clone(), \"{fn_name}\", args)");
|
||||
let (arg_types, return_type) = if m.arg_types.is_empty() && m.return_type.is_empty() && !m.signature.is_empty() {
|
||||
parse_method_signature(&m.signature)
|
||||
} else {
|
||||
(m.arg_types.clone(), m.return_type.clone())
|
||||
};
|
||||
|
||||
let params: Vec<(String, String)> = arg_types
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, t)| (format!("arg{i}"), rust_param_type(t)))
|
||||
.collect();
|
||||
|
||||
let ret_ty = match return_type.as_str() {
|
||||
"()" => "()".to_string(),
|
||||
"" | "ItemData" => "ItemData".to_string(),
|
||||
other => other.to_string(),
|
||||
};
|
||||
|
||||
let param_list = params
|
||||
.iter()
|
||||
.map(|(n, t)| format!("{n}: {t}"))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ");
|
||||
|
||||
if param_list.is_empty() {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}(&self) -> MizeResult<{ret_ty}> {{"
|
||||
);
|
||||
} else {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}(&self, {param_list}) -> MizeResult<{ret_ty}> {{"
|
||||
);
|
||||
}
|
||||
|
||||
let _ = writeln!(out, " let mut args = ItemData::new();");
|
||||
for (i, t) in arg_types.iter().enumerate() {
|
||||
emit_arg_pack(out, i, t, &format!("arg{i}"));
|
||||
}
|
||||
|
||||
match ret_ty.as_str() {
|
||||
"()" => {
|
||||
let _ = writeln!(out, " dyn_call(self.id.clone(), \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(out, " Ok(())");
|
||||
}
|
||||
"ItemData" => {
|
||||
let _ = writeln!(out, " dyn_call(self.id.clone(), \"{fn_name}\", args)");
|
||||
}
|
||||
native if is_native_type(native) => {
|
||||
let _ = writeln!(out, " let data = dyn_call(self.id.clone(), \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" Ok({native} {{ native_num: data.get_path(\"_native\")?.value_u32()? }})"
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
let _ = writeln!(out, " dyn_call(self.id.clone(), \"{fn_name}\", args)");
|
||||
}
|
||||
}
|
||||
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
@@ -114,40 +263,210 @@ fn generate_opt_fn(out: &mut String, _struct_name: &str, o: &OptMetadata) {
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
|
||||
fn generate_native_struct(out: &mut String, n: &NativeMetadata) {
|
||||
fn generate_native_struct(out: &mut String, part_name: &str, n: &NativeMetadata) {
|
||||
let struct_name = &n.name;
|
||||
let _ = writeln!(out, "// native type: {} ({})", n.name, n.type_name);
|
||||
let _ = writeln!(out, "pub struct {struct_name} {{");
|
||||
let _ = writeln!(out, " native_id: u32");
|
||||
let _ = writeln!(out, " pub native_num: u32");
|
||||
let _ = writeln!(out, "}}");
|
||||
let _ = writeln!(out);
|
||||
|
||||
let _ = writeln!(out, "impl FromItemData for {struct_name} {{");
|
||||
let _ = writeln!(out, " fn from_itemdata(data: ItemData) -> MizeResult<Self> {{");
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" Ok({struct_name} {{ native_num: data.get_path(\"_native\")?.value_u32()? }})"
|
||||
);
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out, "}}");
|
||||
let _ = writeln!(out);
|
||||
|
||||
let _ = writeln!(out, "impl {struct_name} {{");
|
||||
for assoc in &n.associated {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {assoc}(args: ItemData) -> MizeResult<ItemData> {{"
|
||||
);
|
||||
let _ = writeln!(out, " let mut mize = get_global_mize()?;");
|
||||
let _ = writeln!(out, " let id = mize.id_new_dots(\"{}.{assoc}\")?;", n.name);
|
||||
let _ = writeln!(out, " dyn_call(id, \"{assoc}\", args)");
|
||||
let _ = writeln!(out, " }}");
|
||||
|
||||
for (i, assoc) in n.associated.iter().enumerate() {
|
||||
let sig = n.associated_sigs.get(i).map(|s| s.as_str()).unwrap_or("");
|
||||
generate_native_associated(out, part_name, n, assoc, sig);
|
||||
}
|
||||
for meth in &n.methods {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {meth}(&self, args: ItemData) -> MizeResult<ItemData> {{"
|
||||
);
|
||||
let _ = writeln!(out, " let mut mize = get_global_mize()?;");
|
||||
let _ = writeln!(out, " let id = mize.id_new_dots(\"{}.{meth}\")?;", n.name);
|
||||
let _ = writeln!(out, " dyn_call(id, \"{meth}\", args)");
|
||||
let _ = writeln!(out, " }}");
|
||||
|
||||
for (i, meth) in n.methods.iter().enumerate() {
|
||||
let sig = n.method_sigs.get(i).map(|s| s.as_str()).unwrap_or("");
|
||||
generate_native_instance_method(out, part_name, n, meth, sig);
|
||||
}
|
||||
|
||||
let _ = writeln!(out, "}}");
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
|
||||
fn generate_native_associated(out: &mut String, part_name: &str, n: &NativeMetadata, fn_name: &str, signature: &str) {
|
||||
let (arg_types, return_type) = parse_method_signature(signature);
|
||||
let ret_ty = if return_type.is_empty() {
|
||||
n.name.clone()
|
||||
} else {
|
||||
return_type
|
||||
};
|
||||
|
||||
let params: Vec<(String, String)> = arg_types
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, t)| (format!("arg{i}"), rust_param_type(t)))
|
||||
.collect();
|
||||
let param_list = params
|
||||
.iter()
|
||||
.map(|(name, ty)| format!("{name}: {ty}"))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ");
|
||||
|
||||
if param_list.is_empty() {
|
||||
let _ = writeln!(out, " pub fn {fn_name}() -> MizeResult<{ret_ty}> {{");
|
||||
} else {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}({param_list}) -> MizeResult<{ret_ty}> {{"
|
||||
);
|
||||
}
|
||||
|
||||
let _ = writeln!(out, " let mut args = ItemData::new();");
|
||||
for (i, t) in arg_types.iter().enumerate() {
|
||||
emit_arg_pack(out, i, t, &format!("arg{i}"));
|
||||
}
|
||||
let _ = writeln!(out, " let mut mize = get_global_mize()?;");
|
||||
let _ = writeln!(out, " let id = mize.id_new_dots(\"{part_name}.{}\")?;", n.name);
|
||||
|
||||
if ret_ty == "()" {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(out, " Ok(())");
|
||||
} else if ret_ty == "ItemData" {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)");
|
||||
} else if is_native_type(&ret_ty) || ret_ty == n.name {
|
||||
let _ = writeln!(out, " let data = dyn_call(id, \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" let native_num: u32 = data.get_path(\"_native\")?.value_u32()?;"
|
||||
);
|
||||
let _ = writeln!(out, " Ok({ret_ty} {{ native_num }})");
|
||||
} else {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)");
|
||||
}
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
|
||||
fn generate_native_instance_method(out: &mut String, part_name: &str, n: &NativeMetadata, fn_name: &str, signature: &str) {
|
||||
let (arg_types, return_type) = parse_method_signature(signature);
|
||||
let ret_ty = if return_type.is_empty() {
|
||||
"ItemData".to_string()
|
||||
} else {
|
||||
return_type
|
||||
};
|
||||
|
||||
let params: Vec<(String, String)> = arg_types
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, t)| (format!("arg{i}"), rust_param_type(t)))
|
||||
.collect();
|
||||
let param_list = params
|
||||
.iter()
|
||||
.map(|(name, ty)| format!("{name}: {ty}"))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ");
|
||||
|
||||
if param_list.is_empty() {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}(&self) -> MizeResult<{ret_ty}> {{"
|
||||
);
|
||||
} else {
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" pub fn {fn_name}(&self, {param_list}) -> MizeResult<{ret_ty}> {{"
|
||||
);
|
||||
}
|
||||
|
||||
let _ = writeln!(out, " let mut args = ItemData::new();");
|
||||
for (i, t) in arg_types.iter().enumerate() {
|
||||
emit_arg_pack(out, i, t, &format!("arg{i}"));
|
||||
}
|
||||
let _ = writeln!(out, " let mut mize = get_global_mize()?;");
|
||||
let _ = writeln!(out, " let id = mize.id_new_dots(\"{part_name}.{}\")?;", n.name);
|
||||
|
||||
match ret_ty.as_str() {
|
||||
"()" => {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(out, " Ok(())");
|
||||
}
|
||||
"ItemData" => {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)");
|
||||
}
|
||||
native if is_native_type(native) => {
|
||||
let _ = writeln!(out, " let data = dyn_call(id, \"{fn_name}\", args)?;");
|
||||
let _ = writeln!(
|
||||
out,
|
||||
" Ok({native} {{ native_num: data.get_path(\"_native\")?.value_u32()? }})"
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
let _ = writeln!(out, " dyn_call(id, \"{fn_name}\", args)");
|
||||
}
|
||||
}
|
||||
let _ = writeln!(out, " }}");
|
||||
let _ = writeln!(out);
|
||||
}
|
||||
|
||||
/// Extract the `mize = ...` dependency assignment from a part's Cargo.toml.
|
||||
///
|
||||
/// Looks under `[dependencies]` (and `[dependencies.mize]` table form) and returns
|
||||
/// a single-line assignment suitable for writing into generated/Cargo.toml, e.g.
|
||||
/// `mize = { workspace = true }`.
|
||||
pub fn extract_mize_dependency(cargo_toml: &str) -> Result<String, String> {
|
||||
let mut in_deps = false;
|
||||
let mut in_mize_table = false;
|
||||
let mut mize_table_fields: Vec<String> = Vec::new();
|
||||
|
||||
for raw_line in cargo_toml.lines() {
|
||||
let line = raw_line.trim();
|
||||
if line.is_empty() || line.starts_with('#') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if line.starts_with('[') && line.ends_with(']') {
|
||||
if in_mize_table {
|
||||
break;
|
||||
}
|
||||
in_deps = line == "[dependencies]";
|
||||
in_mize_table = line == "[dependencies.mize]";
|
||||
continue;
|
||||
}
|
||||
|
||||
if in_mize_table {
|
||||
mize_table_fields.push(line.to_string());
|
||||
continue;
|
||||
}
|
||||
|
||||
if !in_deps {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Inline: mize = ...
|
||||
if let Some(rest) = line.strip_prefix("mize") {
|
||||
let rest = rest.trim_start();
|
||||
if rest.starts_with('=') {
|
||||
return Ok(format!("mize {}", rest));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !mize_table_fields.is_empty() {
|
||||
return Ok(format!("mize = {{ {} }}", mize_table_fields.join(", ")));
|
||||
}
|
||||
|
||||
Err("no 'mize' dependency found under [dependencies] in part Cargo.toml".to_string())
|
||||
}
|
||||
|
||||
/// Generate the `Cargo.toml` content for the generated package.
|
||||
pub fn generate_cargo_toml(package_name: &str) -> String {
|
||||
///
|
||||
/// `mize_dep` is the full assignment line copied from the part Cargo.toml,
|
||||
/// e.g. `mize = { workspace = true }` or `mize = { path = "../../core" }`.
|
||||
pub fn generate_cargo_toml(package_name: &str, mize_dep: &str) -> String {
|
||||
format!(
|
||||
r#"[package]
|
||||
name = "{package_name}"
|
||||
@@ -159,9 +478,10 @@ name = "{lib_name}"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[dependencies]
|
||||
mize = {{ path = "../../core" }}
|
||||
{mize_dep}
|
||||
"#,
|
||||
package_name = package_name,
|
||||
lib_name = package_name.replace('-', "_"),
|
||||
mize_dep = mize_dep.trim(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ pub struct CliPart {
|
||||
}
|
||||
|
||||
impl MizePart for CliPart {
|
||||
fn id(&self) -> MizeId {
|
||||
self.id.clone()
|
||||
fn id(&self) -> MizeResult<MizeId> {
|
||||
Ok(self.id.clone())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ impl CliPart {
|
||||
pub fn get(name: &str) -> MizeResult<CliPart> {
|
||||
let mut mize = get_global_mize()?;
|
||||
let part = mize.get_part(name)?;
|
||||
Ok(CliPart { id: part.id() })
|
||||
Ok(CliPart { id: part.id()? })
|
||||
}
|
||||
pub fn run(&self, cmdline: Vec<String>) -> MizeResult<()> {
|
||||
let cmdline = cmdline.into_item_data();
|
||||
@@ -34,7 +34,7 @@ impl CliPart {
|
||||
pub fn subcommand<T: Fn(ArgMatches) -> MizeResult<()> + Send + Sync + 'static>(&self, subcmd: Command, action: T) -> MizeResult<()> {
|
||||
let mut subcmd_arg = ItemData::new();
|
||||
subcmd_arg.set_path("_native", subcmd.native_id)?;
|
||||
let mut action_arg = ItemData::fun(Box::new(move |args: ItemData| {
|
||||
let action_arg = ItemData::fun(Box::new(move |args: ItemData| {
|
||||
let matches = args.clone().get_path("0")?.native_take_from::<ArgMatches>()?;
|
||||
action(matches)?;
|
||||
Ok(ItemData::new())
|
||||
|
||||
@@ -2,6 +2,7 @@ use std::fs::{create_dir_all, write};
|
||||
use mize::prelude::*;
|
||||
use cmd_lib::run_cmd as sh;
|
||||
use mize::tracing::info;
|
||||
use mize::tracing::debug;
|
||||
|
||||
// a static version of what would be generated.
|
||||
// as we need mize.dev to generate anything.
|
||||
@@ -13,8 +14,7 @@ use generated::*;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn part_dev() -> MizeResult<()> {
|
||||
let mut mize = get_global_mize()?;
|
||||
let mut cli = generated::CliPart::get("cli")?;
|
||||
let cli = generated::CliPart::get("cli")?;
|
||||
cli.set_command("dev");
|
||||
|
||||
cli.subcommand(Command::new("test")?, |_| {println!("hello from test command"); Ok(())})?;
|
||||
@@ -50,11 +50,19 @@ pub fn publish_mize(_ : ArgMatches) -> MizeResult<()> {
|
||||
"x86_64-apple-darwin" => "darwin",
|
||||
_ => "base",
|
||||
};
|
||||
sh!(docker build -t mize-build-$docker_image $mize_src/parts/mize.dev/targets/$docker_image)?;
|
||||
let res = sh!(docker run -it --rm -v $cargo_dir/registry:/usr/local/cargo/registry -v $cargo_dir/git:/usr/local/cargo/git -v $mize_src:/src -v $mize_src/target:/src/target mize-build-$docker_image cargo build --target $target_name --release);
|
||||
let tmp = std::env::var("TMP").unwrap();
|
||||
let mut build_config = ItemData::new();
|
||||
build_config.set_path("namespace", "mize.buildtime.ns")?;
|
||||
std::fs::create_dir_all(&tmp)?;
|
||||
std::fs::File::create(format!("{tmp}/mize-part-dev-build-config.toml"))?;
|
||||
std::fs::write(format!("{tmp}/mize-part-dev-build-config.toml"), build_config.to_json()?)?;
|
||||
sh!(docker build -t mize-build-$docker_image $mize_src/parts/mize.dev/docker/$docker_image)?;
|
||||
sh!(echo running in container: docker run -it --rm -v "$tmp/mize-part-dev-build-config.toml:/build-config.toml" -e MIZE_BUILD_CONFIG=/build-config.toml -v $cargo_dir/registry:/usr/local/cargo/registry -v $cargo_dir/git:/usr/local/cargo/git -v $mize_src:/src -v $mize_src/target:/src/target mize-build-$docker_image cargo build --target $target_name --release --workspace)?;
|
||||
let res = sh!(docker run -it --rm -v "$tmp/mize-part-dev-build-config.toml:/build-config.toml" -e MIZE_BUILD_CONFIG=/build-config.toml -v $cargo_dir/registry:/usr/local/cargo/registry -v $cargo_dir/git:/usr/local/cargo/git -v $mize_src:/src -v $mize_src/target:/src/target mize-build-$docker_image cargo build --target $target_name --release);
|
||||
if res.is_err() {
|
||||
info!("build for {target_name} failed...");
|
||||
}
|
||||
break;
|
||||
};
|
||||
|
||||
|
||||
@@ -79,11 +87,11 @@ pub fn gen_bindings(_ : ArgMatches) -> MizeResult<()> {
|
||||
|
||||
// 2. parse the part name and the gen = [...] list
|
||||
let part_name: String = part_data
|
||||
.get_path("name")
|
||||
.get_path("id")
|
||||
.ok()
|
||||
.and_then(|v| v.value_string().ok())
|
||||
.ok_or_else(|| mize_err!("part file must have a 'name' field"))?;
|
||||
info!("part name: {part_name}");
|
||||
println!("part name: {part_name}");
|
||||
|
||||
let gen_data = part_data
|
||||
.get_path("gen")
|
||||
@@ -97,7 +105,7 @@ pub fn gen_bindings(_ : ArgMatches) -> MizeResult<()> {
|
||||
let s = v.as_text().ok_or_else(|| mize_err!("'gen' array must contain only strings"))?;
|
||||
gen_parts.push(s.to_owned());
|
||||
}
|
||||
info!("parts to generate bindings for: {:?}", gen_parts);
|
||||
debug!("parts to generate bindings for: {:?}", gen_parts);
|
||||
|
||||
// 3. enable generate mode and clear any old metadata
|
||||
mize.set_generate_mode(true)?;
|
||||
@@ -122,7 +130,13 @@ pub fn gen_bindings(_ : ArgMatches) -> MizeResult<()> {
|
||||
create_dir_all(&src_dir).map_err(|e| mize_err!("could not create generated/src dir: {e}"))?;
|
||||
|
||||
let package_name = format!("mize-generated-{part_name}");
|
||||
let cargo_toml = codegen::generate_cargo_toml(&package_name);
|
||||
let part_cargo_path = cwd.join("Cargo.toml");
|
||||
let part_cargo = std::fs::read_to_string(&part_cargo_path)
|
||||
.map_err(|e| mize_err!("could not read part Cargo.toml {}: {e}", part_cargo_path.display()))?;
|
||||
let mize_dep = codegen::extract_mize_dependency(&part_cargo)
|
||||
.map_err(|e| mize_err!("{e}"))?;
|
||||
debug!("using mize dependency from part Cargo.toml: {mize_dep}");
|
||||
let cargo_toml = codegen::generate_cargo_toml(&package_name, &mize_dep);
|
||||
write(gen_dir.join("Cargo.toml"), cargo_toml)
|
||||
.map_err(|e| mize_err!("could not write generated/Cargo.toml: {e}"))?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user