pub struct Context { /* private fields */ }Expand description
Context holds the configuration and dependencies for C2PA operations.
Context replaces the global Settings pattern with a more flexible, thread-safe approach. It encapsulates:
- Settings: Configuration options for C2PA operations
- HTTP Resolvers: Customizable sync and async HTTP resolvers for fetching remote manifests
- Signer: The cryptographic signer used to sign manifests
§Creating a Signer
There are two ways to provide a signer to a Context:
- From Settings (recommended): Configure signer settings in your configuration,
and the Context will create the signer automatically when you call
signer():
[signer.local]
alg = "ps256"
sign_cert = "path/to/cert.pem"
private_key = "path/to/key.pem"let context = Context::new()
.with_settings(include_str!("config.toml"))?;
let builder = Builder::from_context(context);
// Signer is created automatically from context's settings
let signer = builder.context().signer()?;- Custom Signer: Use
with_signer()to provide a custom signer directly. This is useful for HSMs, remote signing services, or custom signing logic.
§Usage with Builder and Reader
Both Builder and Reader can be created with a Context:
// Create a Context with settings
let context = Context::new()
.with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;
// Use with Builder
let builder = Builder::from_context(context);
// Get signer from context (created automatically from settings)
let signer = builder.context().signer()?;§Examples
§Basic usage with default settings
let context = Context::new();§Configure with JSON settings
let context = Context::new().with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;§Configure with TOML settings
let toml = r#"
[verify]
verify_after_sign = true
"#;
let context = Context::new().with_settings(toml)?;Implementations§
Source§impl Context
impl Context
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new Context with default settings.
The default Context will load settings from environment variables or configuration files if available, and use default HTTP resolvers.
§Examples
let context = Context::new();Consume this context and wrap it in an Arc for sharing between components.
This is equivalent to Arc::new(self) or Arc::from(self), but more discoverable
and chainable with the builder pattern.
§Examples
let context = Context::new()
.with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?
.into_shared();
// Now context is Arc<Context> and can be shared
let builder = c2pa::Builder::from_shared_context(&context);
let reader = c2pa::Reader::from_shared_context(&context);Sourcepub fn with_settings<S: IntoSettings>(self, settings: S) -> Result<Self>
pub fn with_settings<S: IntoSettings>(self, settings: S) -> Result<Self>
Configure this Context with the provided settings.
Settings can be provided as a Settings struct, JSON string, TOML string, or serde_json::Value.
§Arguments
settings- Any type that implementsIntoSettings
§Examples
// From JSON string
let context = Context::new().with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;Sourcepub fn settings(&self) -> &Settings
pub fn settings(&self) -> &Settings
Returns a reference to the settings.
§Examples
let context = Context::new();
let settings = context.settings();Sourcepub fn settings_mut(&mut self) -> &mut Settings
pub fn settings_mut(&mut self) -> &mut Settings
Returns a mutable reference to the settings.
§Examples
let mut context = Context::new();
context.settings_mut().verify.verify_after_sign = true;Sourcepub fn with_resolver<T: SyncHttpResolver + Send + Sync + 'static>(
self,
resolver: T,
) -> Self
Available on non-WebAssembly only.
pub fn with_resolver<T: SyncHttpResolver + Send + Sync + 'static>( self, resolver: T, ) -> Self
Configure this Context with a custom synchronous HTTP resolver.
Custom resolvers can be used to add authentication, caching, logging, or mock network calls in tests.
§Arguments
resolver- Any type implementingSyncHttpResolver
Sourcepub fn with_resolver_async<T: AsyncHttpResolver + Send + Sync + 'static>(
self,
resolver: T,
) -> Self
Available on non-WebAssembly only.
pub fn with_resolver_async<T: AsyncHttpResolver + Send + Sync + 'static>( self, resolver: T, ) -> Self
Configure this Context with a custom asynchronous HTTP resolver.
Async resolvers are used for asynchronous operations like fetching remote manifests.
§Arguments
resolver- Any type implementingAsyncHttpResolver
Sourcepub fn resolver(&self) -> &dyn SyncHttpResolver
pub fn resolver(&self) -> &dyn SyncHttpResolver
Returns a reference to the sync resolver.
The default resolver is a SyncGenericResolver wrapped with RestrictedResolver
to apply host filtering from the settings.
Sourcepub fn resolver_async(&self) -> &dyn AsyncHttpResolver
pub fn resolver_async(&self) -> &dyn AsyncHttpResolver
Returns a reference to the async resolver.
The default resolver is an AsyncGenericResolver wrapped with RestrictedResolver
to apply host filtering from the settings.
Sourcepub fn with_signer<T: Signer + Send + Sync + 'static>(self, signer: T) -> Self
Available on non-WebAssembly only.
pub fn with_signer<T: Signer + Send + Sync + 'static>(self, signer: T) -> Self
Configure this Context with a custom cryptographic signer.
Note: In most cases, you don’t need to call this method. Instead, configure signer
settings in your configuration file, and the Context will create the signer automatically
from those settings when you call signer().
Use this method when you need custom control over signer creation, such as:
- Using a hardware security module (HSM)
- Implementing custom signing logic
- Using a remote signing service with custom authentication
§Arguments
signer- Any type implementingSigner
§Examples
// Explicitly create and set a signer
let signer = create_signer::from_files(
"path/to/cert.pem",
"path/to/key.pem",
SigningAlg::Ps256,
None
)?;
let context = Context::new().with_signer(signer);Sourcepub fn signer(&self) -> Result<&dyn Signer>
pub fn signer(&self) -> Result<&dyn Signer>
Returns a reference to the signer.
If a signer was explicitly set via with_signer(), returns that signer.
Otherwise, creates a signer from this Context’s settings on first access (lazy initialization).
The signer is created from the signer field in this Context’s Settings, which should contain
either local signer configuration (certificate and private key) or remote signer configuration
(URL and certificate).
§Returns
A reference to the signer.
§Errors
Returns Error::MissingSignerSettings if:
- No signer was explicitly set with
with_signer() - No signer configuration is present in this Context’s settings
- The signer configuration in settings is invalid
§Examples
§Creating from settings (recommended)
let toml = r#"
[signer.local]
alg = "ps256"
sign_cert = "path/to/cert.pem"
private_key = "path/to/key.pem"
"#;
let context = Context::new().with_settings(toml)?;
// Signer is created automatically from context's settings
let signer = context.signer()?;§Using a custom signer
let signer = create_signer::from_files(
"path/to/cert.pem",
"path/to/key.pem",
SigningAlg::Ps256,
None
)?;
let context = Context::new().with_signer(signer);
let signer_ref = context.signer()?;Sourcepub fn async_signer(&self) -> Result<&dyn AsyncSigner>
pub fn async_signer(&self) -> Result<&dyn AsyncSigner>
Returns a reference to the async signer.
If a custom async signer was set with Context::with_async_signer, it will be returned.
Otherwise, the async signer will be created from the context’s settings on first access
and cached for future use.
§Errors
Returns an error if no async signer is configured in settings and no custom signer was provided.
§Examples
let context = Context::new();
let async_signer = context.async_signer()?;
let signature = async_signer.sign(vec![1, 2, 3]).await?;Sourcepub fn with_async_signer(
self,
signer: impl AsyncSigner + Send + Sync + 'static,
) -> Self
Available on non-WebAssembly only.
pub fn with_async_signer( self, signer: impl AsyncSigner + Send + Sync + 'static, ) -> Self
Sets a custom async signer for this Context.
This replaces any existing async signer (whether from settings or previously set).
§Arguments
signer- An async signer that implements theAsyncSignertrait
§Examples
let context = Context::new()
.with_async_signer(MyAsyncSigner);Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Context
impl !RefUnwindSafe for Context
impl Send for Context
impl Sync for Context
impl Unpin for Context
impl !UnwindSafe for Context
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.