Skip to main content

DomainConfig

Struct DomainConfig 

Source
pub struct DomainConfig {
    pub schema_version: u32,
    pub name: String,
    pub domain: String,
    pub front_door: FrontDoor,
    pub cdn_bucket: String,
    pub worker_bundle_path: Option<String>,
    pub routes: Vec<DomainRoute>,
}
Expand description

A routing manifest for one domain, from .yah/domains/<name>.toml.

The domain manifest is the only place that knows about path routing: services declare static/backend components by opaque ID, and this manifest binds those components to URL paths on a public-facing domain. Generated Worker bundles consume this. See .yah/docs/working/W118-yah-domain-tiers.md (R347).

Fields§

§schema_version: u32§name: String

Stable identifier for this domain (file stem of the manifest). Example: "yah-dev" for the yah.dev zone.

§domain: String

The fully-qualified domain this manifest routes for. Example: "yah.dev", "app.yah.dev".

§front_door: FrontDoor

Which front door serves this domain (R594-F12). Required — a default here would silently re-create the defect the field exists to close. Cross-checked against routes / worker_bundle_path by DomainConfig::validate_front_door at load time.

§cdn_bucket: String

Public CDN bucket name. Static-mode route components publish into this bucket. Owned by the domain, not by any single service.

§worker_bundle_path: Option<String>

Optional path (relative to workspace root) where the generated Worker bundle lands. None while the bundle generator (R347-F4) is still being wired up.

§routes: Vec<DomainRoute>

Implementations§

Source§

impl DomainConfig

Source

pub fn load(path: &Path) -> Result<Self>

Parse a single .yah/domains/<name>.toml, rejecting a manifest whose declared front door contradicts its route table (Self::validate_front_door).

Source

pub fn validate_front_door(&self) -> Result<()>

R594-F12 — the front door must agree with the rest of the manifest.

  • bucket-direct is an R2 custom domain: a Worker route table would never be consulted, so declaring one means the author expected Worker behaviour (clean URLs, SPA fallback, branded errors) from a surface that cannot provide it. Rejected rather than silently ignored. Same for worker_bundle_path — nothing would deploy it.
  • worker / passway with an empty route table is a silent 404 machine: the front door exists, has nothing to serve, and every request falls through to the catch-all.

Called from Self::load, so both CloudConfig::load and CloudConfig::load_from_config_dir enforce it.

Source

pub fn route_headers_json(&self) -> String

The ROUTE_HEADERS Worker binding for this domain (R746) — the route table’s path + headers pairs, in manifest order, with routes that declare no headers dropped. "[]" when nothing declares any.

Order is load-bearing and must survive serialization: the front door applies the FIRST matching rule, so /app/* above /* is what gives the app its isolation headers and leaves the marketing site alone. That is why this is a Vec of pairs and not a map keyed by path.

Infallible by design — Self::validate_route_headers has already run at Self::load, so by the time a reconciler calls this the table is known to be one both front doors can apply.

Source

pub fn validate_route_headers(&self) -> Result<()>

R749-T5 — everything Self::route_headers_json emits must be applicable, checked here where the table is PRODUCED.

That method serializes a typed struct, so the table’s JSON shape is sound by construction. Its contents are not: a route’s headers map is a free-form name -> value read verbatim out of hand-written TOML, so "Cross Origin Opener Policy" (spaces instead of hyphens) or a value carrying a newline ships a structurally-valid table that neither front door can apply — and they fail differently, neither naming the manifest line responsible:

  • passway — mesofact::route_headers::RouteHeaderTable::parse refuses the start, so the origin is simply down.
  • worker — validateRouteHeaderTable accepts it (it checks shape, not header validity) and applyRouteHeaders then throws inside the exported fetch, which is a 500 on every request, not the serve-without-the-headers degradation that code intends.

So the strictness lives at the producer: a table that cannot be applied fails yah cloud apply at manifest load, naming domain, route and header. This is deliberately not a second parser — the check is HeaderName/HeaderValue’s own, the very constructors the passway door runs on the far side, and route matching semantics stay defined once, at the doors. Only routes that contribute to the table are checked, so the invariant is exactly “route_headers_json’s output parses”.

Called from Self::load, alongside Self::validate_front_door.

Source

pub fn serves_service(&self, service: &str) -> bool

Whether this domain’s route table binds any component of service.

Source

pub fn save(&self, workspace_root: &Path) -> Result<()>

Persist to .yah/domains/<name>.toml, creating the domains directory if needed. Create-or-overwrite.

Source

pub fn delete(workspace_root: &Path, name: &str) -> Result<bool>

Remove .yah/domains/<name>.toml. Returns false when the file was already absent.

Trait Implementations§

Source§

impl Clone for DomainConfig

Source§

fn clone(&self) -> DomainConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DomainConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for DomainConfig

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for DomainConfig

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Fruit for T
where T: Send + Downcast,

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more