Skip to main content

LaunchPlan

Struct LaunchPlan 

Source
#[non_exhaustive]
pub struct LaunchPlan { pub program: LaunchProgram, pub args: Vec<String>, pub env: Vec<(String, String)>, pub working_dir: Option<PathBuf>, pub steam_wrapper: Option<SteamWrapper>, }
Expand description

A fully computed launch invocation.

#[non_exhaustive]: fields may be added as more platforms are supported.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§program: LaunchProgram

What to execute.

§args: Vec<String>

Arguments, in order, already resolved. Never shell-quoted.

§env: Vec<(String, String)>

Environment variables to set for the child process.

Only honoured for a program the caller spawns directly. When Self::program is LaunchProgram::Steam, these are set on the short-lived steam process, and steam -applaunch <id> merely messages an already-running Steam client, which starts the game with its own environment. Nothing here reaches the game in that case. The visible consequence is a Proton + Steam launch silently starting unmodded: without WINEDLLOVERRIDES, Wine loads its builtin proxy instead of the loader’s and BepInEx never initialises, leaving no log to explain why. A caller needing the override under Steam must put it in the Wine prefix (proxy_dll gives the name), not here.

§working_dir: Option<PathBuf>

Working directory, when it matters.

§steam_wrapper: Option<SteamWrapper>

Some when starting Self::program is not sufficient on its own: a Linux native Steam launch injects through a loader script that Steam will not run unless a wrapper script is installed in its launch options. See SteamWrapper, write_wrapper_script, and steam_launch_options.

Implementations§

Source§

impl LaunchPlan

Source

pub fn to_command(&self, game_dir: &Path) -> Result<Command>

Translates this plan into the process to spawn.

Always an argv array, never a shell, so a path containing spaces or quotes cannot become an injection. Separate from spawning so the program, arguments, and environment can be asserted without starting anything.

Every LaunchProgram variant is handled, with no wildcard arm. LaunchProgram is #[non_exhaustive], but that only constrains other crates, so a wildcard here would be an unreachable pattern and fail -D warnings. Adding a variant therefore breaks this build deliberately, which is the point: a new launch shape must be translated, not silently rejected at run time.

This is where the host is read, which is why the two variants that need a real path both resolve one here rather than in launch_plan_in: the plan stays a pure computation, and translating it into a process is the step allowed to look at the machine. LaunchProgram::GameExe and LaunchProgram::ProfileScript resolve their binary out of game_dir, and LaunchProgram::Steam resolves the Steam client through crate::steam::steam_exe — a bare steam resolves on Linux but never on Windows, whose Steam installer adds nothing to PATH.

Trait Implementations§

Source§

impl Clone for LaunchPlan

Source§

fn clone(&self) -> Self

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 LaunchPlan

Source§

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

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

impl Eq for LaunchPlan

Source§

impl PartialEq for LaunchPlan

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for LaunchPlan

Auto Trait Implementations§

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<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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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