pub struct BuildConfig {
pub command: Option<String>,
pub out_dir: PathBuf,
pub render_command: Option<String>,
}Expand description
Build step that produces the static artifact published by a
mesofact-static workload.
deny_unknown_fields is load-bearing (R658-B1). TOML scopes every key
written after a table header into that table, so a manifest that puts a
top-level MesofactStaticWorkload field — routes was the one that
actually happened — below [build] silently produces build.routes
instead. Without this attribute serde discards the stray key, the
top-level field falls back to its default (or fails with a missing field
error pointing at the wrong place), and the manifest deploys with a
declaration nobody honours. Every real workload.toml in the camp and the
CLI’s own yah cloud site init scaffold carried exactly that shape for
months without a single reader noticing.
The cost is forward-compat: a manifest carrying a [build] key this binary
doesn’t know is a hard parse error, not an ignored key. That is deliberate.
A build config is a small, slow-moving, load-bearing table — a key that
silently does nothing is worse here than one that refuses to load, because
the failure surfaces as a wrong artifact rather than an error.
Note deny_unknown_fields is inert for the postcard kamaji wire, which is
non-self-describing and positional — this only constrains TOML/JSON.
Fields§
§command: Option<String>Shell command run from the manifest’s directory, e.g. "bun run build".
Absent means “this project has no external bundler step” (R838-B1),
not “run nothing by accident”. mesofact new’s scaffold deliberately
omits it — the in-process pipeline (mesofact-dev / mesofact-build)
produces out_dir with no third binary, no package manager and no Node
— so requiring it here made every scaffolded project’s manifest fail to
load through this envelope. Setting it opts back out to a shell command,
which is what a project with its own bundler wants.
Consumers were already written for this: read_workload_build
(app/yah/cli/src/cloud.rs) has always typed it Option<String> and
yah cloud bundle build only needs it under --run-build; the bundle
sync arm refuses None by name. MesofactStaticReconciler:: rebuild_static skips the build step for None — the same thing it
already did for a workload with no workload.toml at all.
WIRE NOTE: this is Option<String> on the postcard kamaji wire, so it
costs a leading 0x00/0x01 tag byte that the bare String did not
have. A pre-R838 node decoding a new frame fails loudly (the string’s
length byte is not a valid Option tag) rather than silently reading a
shifted field — which is why this is Option and not a #[serde(default)]
empty String sentinel. Not a cluster_epochs surface: those hash the
raft modules and the openraft pin, not workload_spec.
out_dir: PathBufOutput directory (relative to the manifest) the reconciler uploads.
render_command: Option<String>Data-only re-render command (W225 §3 “revalidate”), run from the
manifest’s directory against the already-built out_dir — no
bundler. {route} is substituted with the invalidated route pattern,
e.g. "../../../../scripts/mesofact-build.sh render . --route {route} --all" (R746-F9 — resolves a prebuilt binary rather than shelling to
cargo, which cannot even find the package from a site’s own dir).
Absent → a revalidate dispatch republishes out_dir as-is.
Trait Implementations§
Source§impl Clone for BuildConfig
impl Clone for BuildConfig
Source§fn clone(&self) -> BuildConfig
fn clone(&self) -> BuildConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BuildConfig
impl Debug for BuildConfig
Source§impl<'de> Deserialize<'de> for BuildConfig
impl<'de> Deserialize<'de> for BuildConfig
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for BuildConfig
Source§impl PartialEq for BuildConfig
impl PartialEq for BuildConfig
Source§impl Serialize for BuildConfig
impl Serialize for BuildConfig
impl StructuralPartialEq for BuildConfig
Source§impl TS for BuildConfig
impl TS for BuildConfig
Source§type WithoutGenerics = BuildConfig
type WithoutGenerics = BuildConfig
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or (). The only requirement for these dummy types is that
EXPORT_TO must be None. Read moreSource§type OptionInnerType = BuildConfig
type OptionInnerType = BuildConfig
std::option::Option<T>, then this associated type is set to T.
All other implementations of TS should set this type to Self instead.Source§fn docs() -> Option<String>
fn docs() -> Option<String>
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn decl_concrete(cfg: &Config) -> String
fn decl_concrete(cfg: &Config) -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl(cfg: &Config) -> String
fn decl(cfg: &Config) -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline(cfg: &Config) -> String
fn inline(cfg: &Config) -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened(cfg: &Config) -> String
fn inline_flattened(cfg: &Config) -> String
Source§fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn output_path() -> Option<PathBuf>
fn output_path() -> Option<PathBuf>
T should be exported, relative to the output directory.
The returned path does not include any base directory. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
Source§fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export. Read moreSource§fn export_to_string(cfg: &Config) -> Result<String, ExportError>where
Self: 'static,
fn export_to_string(cfg: &Config) -> Result<String, ExportError>where
Self: 'static,
Auto Trait Implementations§
impl Freeze for BuildConfig
impl RefUnwindSafe for BuildConfig
impl Send for BuildConfig
impl Sync for BuildConfig
impl Unpin for BuildConfig
impl UnsafeUnpin for BuildConfig
impl UnwindSafe for BuildConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.