Skip to main content

PacEnv

Struct PacEnv 

pub struct PacEnv { /* private fields */ }
Available on crate features js and pac and std only.
Expand description

Builds the PAC javascript environment.

Registering it on a JsRuntimeBuilder adds every standard PAC host function, including Microsoft’s IPv6-aware extensions. Chromium defines that set except for getClientVersion; rama supports the full Microsoft surface.

Implementations§

§

impl PacEnv

pub const DEFAULT_DNS_TIMEOUT: Duration

Default per-lookup timeout for the dns host functions.

pub const DEFAULT_MAX_LOOKUPS_PER_EVALUATION: u32 = 64

Default number of dns lookups one evaluation may make.

Generous for any real policy — reference scripts resolve the request host and little else — while keeping a hostile script from turning one request into an unbounded burst of queries.

pub const DEFAULT_MAX_GLOB_STEPS_PER_EVALUATION: u64 = 50_000_000

Default number of character comparisons shExpMatch may spend in one evaluation, across every call it makes.

Glob matching is native work no deadline can interrupt, so it needs a bound of its own. Far above what a real policy spends — a rule set testing a url costs thousands of steps, not millions — and exhausting it fails the evaluation rather than answering false, so a padded url cannot quietly stop a rule from matching.

pub const DEFAULT_MAX_ALERTS_PER_EVALUATION: u32 = 32

Default number of alert calls one evaluation may write to the log.

Diagnostics for a script author, not a channel a script may use to fill an operator’s disk.

pub const DEFAULT_MAX_BLOCKING_PER_EVALUATION: Duration

Default wall clock the host functions may block one evaluation for.

Name resolution blocks the worker thread, and the execution time limit cannot interrupt it, so the lookup count alone would still let one evaluation hold its worker for count times the dns timeout.

pub fn new() -> PacEnv

Create a PAC environment with the default configuration: the global dns resolver and the system clock.

pub fn maybe_with_resolver( self, resolver: Option<BoxDnsAddressResolver>, ) -> PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn maybe_set_resolver( &mut self, resolver: Option<BoxDnsAddressResolver>, ) -> &mut PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn with_resolver(self, resolver: BoxDnsAddressResolver) -> PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn set_resolver(&mut self, resolver: BoxDnsAddressResolver) -> &mut PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn without_resolver(self) -> PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn unset_resolver(&mut self) -> &mut PacEnv

Resolve names through this resolver instead of the GlobalDnsResolver.

pub fn dns_timeout(&self) -> Duration

The timeout one dns lookup gets.

pub fn max_lookups_per_evaluation(&self) -> u32

How many dns lookups one evaluation may make.

pub fn max_glob_steps_per_evaluation(&self) -> u64

How many shExpMatch steps one evaluation may spend.

pub fn max_alerts_per_evaluation(&self) -> u32

How many alert calls one evaluation may log.

pub fn max_blocking_per_evaluation(&self) -> Duration

How long the host functions may block one evaluation.

pub fn ipv6_extensions(&self) -> bool

Whether the ipv6-aware extensions are defined.

pub fn with_dns_timeout(self, dns_timeout: Duration) -> PacEnv

Timeout for a single dns lookup made by a host function (defaults to Self::DEFAULT_DNS_TIMEOUT).

A lookup that exceeds it reports the host as unresolvable rather than failing the evaluation.

pub fn set_dns_timeout(&mut self, dns_timeout: Duration) -> &mut PacEnv

Timeout for a single dns lookup made by a host function (defaults to Self::DEFAULT_DNS_TIMEOUT).

A lookup that exceeds it reports the host as unresolvable rather than failing the evaluation.

pub fn with_max_lookups_per_evaluation(self, lookups: u32) -> PacEnv

How many distinct hosts one evaluation may resolve before further lookups fail it (defaults to Self::DEFAULT_MAX_LOOKUPS_PER_EVALUATION).

Repeats within an evaluation are served from its own cache and cost nothing. Exhausting the budget throws rather than reporting a host as unresolvable: a script must not be able to spend it and have the rule that follows quietly stop matching.

Only enforced for callers that arm the budget per evaluation, as PacResolver does.

pub fn set_max_lookups_per_evaluation(&mut self, lookups: u32) -> &mut PacEnv

How many distinct hosts one evaluation may resolve before further lookups fail it (defaults to Self::DEFAULT_MAX_LOOKUPS_PER_EVALUATION).

Repeats within an evaluation are served from its own cache and cost nothing. Exhausting the budget throws rather than reporting a host as unresolvable: a script must not be able to spend it and have the rule that follows quietly stop matching.

Only enforced for callers that arm the budget per evaluation, as PacResolver does.

pub fn with_sh_exp_match(self, sh_exp_match: PacShExpMatch) -> PacEnv

How shExpMatch reads its pattern (defaults to PacShExpMatch::Reference, what browsers do).

pub fn set_sh_exp_match(&mut self, sh_exp_match: PacShExpMatch) -> &mut PacEnv

How shExpMatch reads its pattern (defaults to PacShExpMatch::Reference, what browsers do).

pub fn with_ipv6_extensions(self, ipv6_extensions: bool) -> PacEnv

Define the ipv6-aware extensions — dnsResolveEx, isResolvableEx, isInNetEx, myIpAddressEx, sortIpAddressList and getClientVersion — and prefer a FindProxyForURLEx entry point (defaults to true).

Microsoft defines all six helpers and WinHTTP prefers the extended entry point; rama follows both behaviours. Chromium adopted five helpers but omits getClientVersion, while Firefox defines none of them. Turning the option off exposes only the classic surface.

pub fn set_ipv6_extensions(&mut self, ipv6_extensions: bool) -> &mut PacEnv

Define the ipv6-aware extensions — dnsResolveEx, isResolvableEx, isInNetEx, myIpAddressEx, sortIpAddressList and getClientVersion — and prefer a FindProxyForURLEx entry point (defaults to true).

Microsoft defines all six helpers and WinHTTP prefers the extended entry point; rama follows both behaviours. Chromium adopted five helpers but omits getClientVersion, while Firefox defines none of them. Turning the option off exposes only the classic surface.

pub fn with_max_blocking_per_evaluation(self, blocking: Duration) -> PacEnv

How long the host functions may block one evaluation before the rest fail it (defaults to Self::DEFAULT_MAX_BLOCKING_PER_EVALUATION).

pub fn set_max_blocking_per_evaluation( &mut self, blocking: Duration, ) -> &mut PacEnv

How long the host functions may block one evaluation before the rest fail it (defaults to Self::DEFAULT_MAX_BLOCKING_PER_EVALUATION).

pub fn with_max_alerts_per_evaluation(self, alerts: u32) -> PacEnv

How many alert calls one evaluation may write to the log before the rest are dropped (defaults to Self::DEFAULT_MAX_ALERTS_PER_EVALUATION).

pub fn set_max_alerts_per_evaluation(&mut self, alerts: u32) -> &mut PacEnv

How many alert calls one evaluation may write to the log before the rest are dropped (defaults to Self::DEFAULT_MAX_ALERTS_PER_EVALUATION).

pub fn with_max_glob_steps_per_evaluation(self, steps: u64) -> PacEnv

How many shExpMatch character comparisons one evaluation may spend before the evaluation fails (defaults to Self::DEFAULT_MAX_GLOB_STEPS_PER_EVALUATION).

pub fn set_max_glob_steps_per_evaluation(&mut self, steps: u64) -> &mut PacEnv

How many shExpMatch character comparisons one evaluation may spend before the evaluation fails (defaults to Self::DEFAULT_MAX_GLOB_STEPS_PER_EVALUATION).

pub fn with_local_addresses(self, local_addresses: PacLocalAddresses) -> PacEnv

Which local addresses myIpAddress() and myIpAddressEx() disclose to the script (defaults to browser behaviour, see PacLocalAddresses).

pub fn set_local_addresses( &mut self, local_addresses: PacLocalAddresses, ) -> &mut PacEnv

Which local addresses myIpAddress() and myIpAddressEx() disclose to the script (defaults to browser behaviour, see PacLocalAddresses).

pub fn with_promote_ipv4_in_net(self, promote_ipv4_in_net: bool) -> PacEnv

Compare an ipv4 address against an ipv6 isInNetEx prefix as its v4-mapped form, and vice versa (defaults to true, which is what browsers do).

Note this makes an ipv6 catch-all such as ::/0 match ipv4 addresses too; disable it to keep families strictly apart.

pub fn set_promote_ipv4_in_net( &mut self, promote_ipv4_in_net: bool, ) -> &mut PacEnv

Compare an ipv4 address against an ipv6 isInNetEx prefix as its v4-mapped form, and vice versa (defaults to true, which is what browsers do).

Note this makes an ipv6 catch-all such as ::/0 match ipv4 addresses too; disable it to keep families strictly apart.

pub fn maybe_with_clock( self, clock: Option<Arc<dyn Fn() -> Zoned + Sync + Send>>, ) -> PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn maybe_set_clock( &mut self, clock: Option<Arc<dyn Fn() -> Zoned + Sync + Send>>, ) -> &mut PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn with_clock(self, clock: Arc<dyn Fn() -> Zoned + Sync + Send>) -> PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn set_clock( &mut self, clock: Arc<dyn Fn() -> Zoned + Sync + Send>, ) -> &mut PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn without_clock(self) -> PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn unset_clock(&mut self) -> &mut PacEnv

Read the current time from this clock instead of the system one, so the time-based host functions can be pinned in tests.

pub fn with_dns_resolver(self, resolver: impl DnsAddressResolver) -> PacEnv

Set the dns resolver, taking any DnsAddressResolver.

pub fn register( self, builder: JsRuntimeBuilder, ) -> Result<PacRuntimeBuilder, Box<dyn Error + Sync + Send>>

Register every PAC host function on the given runtime builder.

Requires an ambient tokio runtime: the dns host functions are synchronous and block the script’s worker thread on it.

Trait Implementations§

§

impl Clone for PacEnv

§

fn clone(&self) -> PacEnv

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
§

impl Debug for PacEnv

§

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

Formats the value using the given formatter. Read more
§

impl Default for PacEnv

§

fn default() -> PacEnv

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

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

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

§

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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

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.

§

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

§

fn from_ref(input: &T) -> T

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

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a rama_grpc::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

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

§

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
§

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
§

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

§

fn rama_from(value: T) -> U

§

impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where U: RamaFrom<T, CrateMarker>,

§

fn rama_into(self) -> U

§

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

§

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

§

fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>

§

impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where U: RamaTryFrom<T, CrateMarker>,

§

type Error = <U as RamaTryFrom<T, CrateMarker>>::Error

§

fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>

§

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

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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.
§

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

§

fn vzip(self) -> V

§

impl<V, F> ValueFormatter<&V> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &&V)

Write value to writer
§

impl<V, F> ValueFormatter<Arc<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Arc<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Box<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Box<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Cow<'_, V>> for F
where V: ToOwned + ?Sized, F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)

Write value to writer
§

impl<V, F> ValueFormatter<Option<V>> for F
where F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Option<V>)

Write value to writer
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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