pub struct PermissionRelay<'a> { /* private fields */ }Expand description
Relay native permission requests to a consumer and forward decisions back.
A PermissionRelay sits between a backend CLI’s streaming output and a
consumer: it watches parsed output messages for native permission requests,
normalizes them, asks the consumer for a decision, and writes the native
response frame back to the CLI’s stdin as NDJSON.
The relay is intentionally transport-agnostic — it does not own the child
process. The caller supplies a write closure (typically the child’s stdin)
and feeds it parsed messages, which keeps it fully unit-testable.
Implementations§
Source§impl<'a> PermissionRelay<'a>
impl<'a> PermissionRelay<'a>
Sourcepub fn new<F, W>(tool: &str, on_request: F, write: W) -> Self
pub fn new<F, W>(tool: &str, on_request: F, write: W) -> Self
Create a new relay.
on_requestresolves a normalized request to a decision (once|always|reject).writereceives a serialized NDJSON frame to forward to the tool stdin.
Sourcepub fn handle_message(
&mut self,
message: &Value,
) -> Option<(NormalizedPermissionRequest, String)>
pub fn handle_message( &mut self, message: &Value, ) -> Option<(NormalizedPermissionRequest, String)>
Process a single parsed output message. When the message is a permission
request, resolves the consumer’s decision and writes the native response.
Returns the normalized request and the applied decision, or None when the
message is not a permission request.
Sourcepub fn get_handled(&self) -> &[(NormalizedPermissionRequest, String, Value)]
pub fn get_handled(&self) -> &[(NormalizedPermissionRequest, String, Value)]
All permission requests handled so far (for inspection/testing).
Auto Trait Implementations§
impl<'a> !RefUnwindSafe for PermissionRelay<'a>
impl<'a> !Send for PermissionRelay<'a>
impl<'a> !Sync for PermissionRelay<'a>
impl<'a> !UnwindSafe for PermissionRelay<'a>
impl<'a> Freeze for PermissionRelay<'a>
impl<'a> Unpin for PermissionRelay<'a>
impl<'a> UnsafeUnpin for PermissionRelay<'a>
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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