use std::marker::PhantomData;
use ulid::Ulid;
use crate::ManifestStore;
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub struct SessionHandle<'a> {
audit_session_id: &'a str,
_life: PhantomData<&'a ()>,
}
impl<'a> SessionHandle<'a> {
pub(crate) fn new(audit_session_id: &'a str) -> Self {
Self {
audit_session_id,
_life: PhantomData,
}
}
pub fn audit_session_id(&self) -> &'a str {
self.audit_session_id
}
}
#[non_exhaustive]
pub struct ToolResources<'a> {
pipeline: &'a gaze::Pipeline,
session: &'a gaze::Session,
manifest: &'a dyn ManifestStore,
locale_chain: &'a [gaze::LocaleTag],
_life: PhantomData<&'a ()>,
}
impl<'a> ToolResources<'a> {
pub(crate) fn new(
pipeline: &'a gaze::Pipeline,
session: &'a gaze::Session,
manifest: &'a dyn ManifestStore,
locale_chain: &'a [gaze::LocaleTag],
) -> Self {
Self {
pipeline,
session,
manifest,
locale_chain,
_life: PhantomData,
}
}
pub fn pipeline(&self) -> &'a gaze::Pipeline {
self.pipeline
}
pub fn session(&self) -> &'a gaze::Session {
self.session
}
pub fn manifest(&self) -> &'a dyn ManifestStore {
self.manifest
}
pub fn locale_chain(&self) -> &'a [gaze::LocaleTag] {
self.locale_chain
}
}
impl std::fmt::Debug for ToolResources<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ToolResources")
.field("pipeline", &"<gaze::Pipeline>")
.field("session", &"<gaze::Session>")
.field("manifest", &"<dyn ManifestStore>")
.field("locale_chain", &self.locale_chain)
.finish()
}
}
#[non_exhaustive]
pub struct ToolCtx<'a> {
pub(crate) session: SessionHandle<'a>,
pub(crate) resources: ToolResources<'a>,
pub(crate) redacted_args: serde_json::Value,
pub(crate) call_id: Ulid,
pub(crate) tool_name: &'a str,
pub(crate) principal_id: &'a str,
_life: PhantomData<&'a ()>,
}
impl<'a> ToolCtx<'a> {
pub(crate) fn new_with_resources(
session: SessionHandle<'a>,
resources: ToolResources<'a>,
redacted_args: serde_json::Value,
call_id: Ulid,
tool_name: &'a str,
principal_id: &'a str,
) -> Self {
Self {
session,
resources,
redacted_args,
call_id,
tool_name,
principal_id,
_life: PhantomData,
}
}
pub fn redacted_args(&self) -> &serde_json::Value {
&self.redacted_args
}
pub fn session(&self) -> &SessionHandle<'a> {
&self.session
}
pub fn resources(&self) -> &ToolResources<'a> {
&self.resources
}
pub fn call_id(&self) -> Ulid {
self.call_id
}
pub fn tool_name(&self) -> &'a str {
self.tool_name
}
pub fn principal_id(&self) -> &'a str {
self.principal_id
}
}
impl std::fmt::Debug for ToolCtx<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ToolCtx")
.field("session", &self.session)
.field("resources", &self.resources)
.field("redacted_args", &self.redacted_args)
.field("call_id", &self.call_id)
.field("tool_name", &self.tool_name)
.field("principal_id", &self.principal_id)
.finish()
}
}