Skip to main content

BootConfig

Struct BootConfig 

Source
pub struct BootConfig<'a> {
    pub node_name: Option<&'a str>,
    pub locator: Option<&'a str>,
    pub domain_id: Option<u32>,
    pub namespace: Option<&'a str>,
    pub rmw: Option<&'a str>,
}
Expand description

Session-identity subset a caller supplies to ExecutorConfig::resolve.

None on a field means “not specified — fall through to the next precedence level”. The precedence model (A) resolved by ExecutorConfig::resolve is:

env rung (a Some field on the [`EnvRung`] the caller supplies)
  > baked (a Some field here)
    > compiled default

Fields are resolved independently: an env locator and a baked node_name can both apply in the same call.

Note: mode (session mode) is not configurable through BootConfig. Session mode comes from the env rung, defaulting to SessionMode::Client.

Fields§

§node_name: Option<&'a str>

Node name override. Maps to ExecutorConfig::node_name.

§locator: Option<&'a str>

Middleware locator override. Maps to ExecutorConfig::locator.

§domain_id: Option<u32>

ROS 2 domain ID override. Maps to ExecutorConfig::domain_id.

§namespace: Option<&'a str>

Node namespace override. Maps to ExecutorConfig::namespace.

§rmw: Option<&'a str>

RMW backend selector. Maps to ExecutorConfig::rmw, the name nros_rmw_cffi::resolve_backend looks up.

Issue 1050 defect (3) — this rung did not exist. Every other field of ExecutorConfig resolved env > baked > compiled default; rmw resolved from the environment ALONE, so $NROS_RMW was the only way in the tree to name a backend. An image that knows perfectly well which backend it wants — a PX4 module declaring BACKENDS uorb, a C entry built against one RMW, any embedded target with no environment to read — could not say so, and got whichever backend registered first.

The environment still wins, because a deployment overriding a build is the whole point of precedence model A. What changed is that there is now something for it to override.

Implementations§

Source§

impl<'a> BootConfig<'a>

Source

pub fn from_baked(baked: &'a BakedBootConfig) -> BootConfig<'a>

Read a baked config into the plain-field BootConfig the resolver consumes.

Returns all-None (→ resolver uses compiled defaults) if magic/version don’t match — defensive against a corrupt or zero-initialised section.

Each Option is Some iff its set_flags bit is set; string values are the bytes up to the first NUL (or full buffer if no NUL). Invalid UTF-8 in a set field is treated as unset for that field.

Source

pub fn over_board_defaults( self, locator: &'a str, domain_id: u32, default_node_name: &'a str, ) -> BootConfig<'a>

Issue 1434 — the rung an EMBEDDED board hands the resolver: this bake’s IDENTITY over the board’s own connect facts.

Six boards (nros-board-freertos ×2, nros-board-threadx ×2, nros-board-mps2-an385, nros-board-esp32-qemu) wrote this struct literal out by hand, character for character, and every one of them wrote namespace: None — so a launch-declared namespace reached the blob, from_baked read it correctly, and then the board dropped it on the floor. It is ONE function now, for the reason issue 0196 gives: six copies are six places for the next field to be forgotten, and the forgetting is silent (a None is a legal value, not a compile error).

What comes from where, and why the split is not symmetric:

  • Identity (node_name, namespace) — the BAKE wins, falling back to default_node_name and to the resolver’s "". A launch file that names a node is stating what the graph should call it; the board has no opinion worth overriding that with.
  • Connect (locator, domain_id) — the BOARD wins, unconditionally and exactly as before this function existed. An embedded board has no environment rung, so its Config (per-board TOML / Kconfig) IS the deployment statement for where to dial and on which domain. Changing that is a separate decision from this one and is deliberately NOT made here.
  • rmw — the bake (issue 1050 defect (3)), unchanged.

The NEGATIVE direction is the half that matters: a blob with BOOT_SET_NAMESPACE clear arrives as namespace: None from Self::from_baked, travels through here as None, and lands on the resolver’s compiled default. It never becomes Some(""), which would read as “configured to the empty namespace” to every rung above it.

Trait Implementations§

Source§

impl<'a> Clone for BootConfig<'a>

Source§

fn clone(&self) -> BootConfig<'a>

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<'a> Copy for BootConfig<'a>

Source§

impl<'a> Debug for BootConfig<'a>

Source§

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

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

impl<'a> Default for BootConfig<'a>

Source§

fn default() -> BootConfig<'a>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for BootConfig<'a>

§

impl<'a> RefUnwindSafe for BootConfig<'a>

§

impl<'a> Send for BootConfig<'a>

§

impl<'a> Sync for BootConfig<'a>

§

impl<'a> Unpin for BootConfig<'a>

§

impl<'a> UnsafeUnpin for BootConfig<'a>

§

impl<'a> UnwindSafe for BootConfig<'a>

Blanket Implementations§

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<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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.