//! Generated by `trust-tasks-codegen` — do not edit by hand.
//!
//! Spec slug: `governance/capability/list`. Version: `0.1`.
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
/// Error types.
pub mod error {
/// Error from a `TryFrom` or `FromStr` implementation.
pub struct ConversionError(::std::borrow::Cow<'static, str>);
impl ::std::error::Error for ConversionError {}
impl ::std::fmt::Display for ConversionError {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> Result<(), ::std::fmt::Error> {
::std::fmt::Display::fmt(&self.0, f)
}
}
impl ::std::fmt::Debug for ConversionError {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> Result<(), ::std::fmt::Error> {
::std::fmt::Debug::fmt(&self.0, f)
}
}
impl From<&'static str> for ConversionError {
fn from(value: &'static str) -> Self {
Self(value.into())
}
}
impl From<String> for ConversionError {
fn from(value: String) -> Self {
Self(value.into())
}
}
}
///The self-description of a pluggable community capability: the Trust Task families it serves, the trust-registry vocabulary it reads and writes, the roles that may operate it, the membership lifecycle hooks it consumes, and the external adapters that act on its decisions. The manifest is what governance approves, what discovery advertises, and what a management UX renders.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "CapabilityManifest",
/// "description": "The self-description of a pluggable community capability: the Trust Task families it serves, the trust-registry vocabulary it reads and writes, the roles that may operate it, the membership lifecycle hooks it consumes, and the external adapters that act on its decisions. The manifest is what governance approves, what discovery advertises, and what a management UX renders.",
/// "type": "object",
/// "required": [
/// "capability",
/// "specs",
/// "version"
/// ],
/// "properties": {
/// "capability": {
/// "description": "The capability's namespace slug, e.g. `git-trust`.",
/// "type": "string",
/// "pattern": "^[a-z0-9][a-z0-9-]*$"
/// },
/// "configSchema": {
/// "description": "Spec slug of the JSON schema the per-community `config` document must validate against.",
/// "type": "string"
/// },
/// "consentClass": {
/// "description": "Map of capability operation to the consent class its execution requires under the host's delegated-execution policy.",
/// "type": "object",
/// "additionalProperties": {
/// "type": "string",
/// "enum": [
/// "normal",
/// "elevated",
/// "destructive"
/// ]
/// }
/// },
/// "description": {
/// "description": "One-paragraph description for management surfaces.",
/// "type": "string",
/// "maxLength": 1024
/// },
/// "ext": {
/// "$ref": "#/definitions/Ext"
/// },
/// "externalAdapters": {
/// "description": "Out-of-stack components that consume this capability's trust decisions.",
/// "type": "array",
/// "items": {
/// "type": "object",
/// "required": [
/// "kind",
/// "ref"
/// ],
/// "properties": {
/// "kind": {
/// "description": "Adapter type, e.g. `github-action`, `webhook`.",
/// "type": "string"
/// },
/// "ref": {
/// "description": "Where the adapter lives, e.g. a repository path or URL.",
/// "type": "string"
/// }
/// },
/// "additionalProperties": false
/// }
/// },
/// "lifecycleHooks": {
/// "description": "Membership lifecycle events the capability consumes, e.g. `member.enrolled`, `member.revoked`, `role.changed`.",
/// "type": "array",
/// "items": {
/// "type": "string"
/// }
/// },
/// "roles": {
/// "description": "Map of capability operation (e.g. `grant`, `view`) to the community roles allowed to perform it.",
/// "type": "object",
/// "additionalProperties": {
/// "type": "array",
/// "items": {
/// "type": "string"
/// }
/// }
/// },
/// "specs": {
/// "description": "Trust Task spec slugs (or `<family>/*` globs) this capability serves when enabled.",
/// "type": "array",
/// "items": {
/// "type": "string"
/// },
/// "minItems": 1
/// },
/// "title": {
/// "description": "Human-readable capability name for management surfaces.",
/// "type": "string",
/// "maxLength": 256
/// },
/// "version": {
/// "description": "Manifest/capability version, `MAJOR.MINOR`.",
/// "type": "string",
/// "pattern": "^[0-9]+\\.[0-9]+$"
/// },
/// "vocabulary": {
/// "description": "The trust-registry tuple vocabulary this capability may read and write. A conforming host MUST reject writes by this capability whose `action` is not listed.",
/// "type": "object",
/// "required": [
/// "actions"
/// ],
/// "properties": {
/// "actions": {
/// "description": "TRQP `action` values this capability owns, e.g. `git.commit.sign`.",
/// "type": "array",
/// "items": {
/// "type": "string"
/// },
/// "minItems": 1
/// },
/// "resourcePattern": {
/// "description": "Human-readable pattern of the `resource` values used, e.g. `<org>[/<repo>]`.",
/// "type": "string"
/// }
/// },
/// "additionalProperties": false
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct CapabilityManifest {
///The capability's namespace slug, e.g. `git-trust`.
pub capability: CapabilityManifestCapability,
///Spec slug of the JSON schema the per-community `config` document must validate against.
#[serde(
rename = "configSchema",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub config_schema: ::std::option::Option<::std::string::String>,
///Map of capability operation to the consent class its execution requires under the host's delegated-execution policy.
#[serde(
rename = "consentClass",
default,
skip_serializing_if = ":: std :: collections :: HashMap::is_empty"
)]
pub consent_class:
::std::collections::HashMap<::std::string::String, CapabilityManifestConsentClassValue>,
///One-paragraph description for management surfaces.
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub description: ::std::option::Option<CapabilityManifestDescription>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub ext: ::std::option::Option<Ext>,
///Out-of-stack components that consume this capability's trust decisions.
#[serde(
rename = "externalAdapters",
default,
skip_serializing_if = "::std::vec::Vec::is_empty"
)]
pub external_adapters: ::std::vec::Vec<CapabilityManifestExternalAdaptersItem>,
///Membership lifecycle events the capability consumes, e.g. `member.enrolled`, `member.revoked`, `role.changed`.
#[serde(
rename = "lifecycleHooks",
default,
skip_serializing_if = "::std::vec::Vec::is_empty"
)]
pub lifecycle_hooks: ::std::vec::Vec<::std::string::String>,
///Map of capability operation (e.g. `grant`, `view`) to the community roles allowed to perform it.
#[serde(
default,
skip_serializing_if = ":: std :: collections :: HashMap::is_empty"
)]
pub roles:
::std::collections::HashMap<::std::string::String, ::std::vec::Vec<::std::string::String>>,
///Trust Task spec slugs (or `<family>/*` globs) this capability serves when enabled.
pub specs: ::std::vec::Vec<::std::string::String>,
///Human-readable capability name for management surfaces.
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub title: ::std::option::Option<CapabilityManifestTitle>,
///Manifest/capability version, `MAJOR.MINOR`.
pub version: CapabilityManifestVersion,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub vocabulary: ::std::option::Option<CapabilityManifestVocabulary>,
}
impl CapabilityManifest {
pub fn builder() -> builder::CapabilityManifest {
Default::default()
}
}
///The capability's namespace slug, e.g. `git-trust`.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "The capability's namespace slug, e.g. `git-trust`.",
/// "type": "string",
/// "pattern": "^[a-z0-9][a-z0-9-]*$"
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct CapabilityManifestCapability(::std::string::String);
impl ::std::ops::Deref for CapabilityManifestCapability {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<CapabilityManifestCapability> for ::std::string::String {
fn from(value: CapabilityManifestCapability) -> Self {
value.0
}
}
impl ::std::str::FromStr for CapabilityManifestCapability {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
static PATTERN: ::std::sync::LazyLock<::regress::Regex> =
::std::sync::LazyLock::new(|| ::regress::Regex::new("^[a-z0-9][a-z0-9-]*$").unwrap());
if PATTERN.find(value).is_none() {
return Err("doesn't match pattern \"^[a-z0-9][a-z0-9-]*$\"".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for CapabilityManifestCapability {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for CapabilityManifestCapability {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for CapabilityManifestCapability {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for CapabilityManifestCapability {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`CapabilityManifestConsentClassValue`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "enum": [
/// "normal",
/// "elevated",
/// "destructive"
/// ]
///}
/// ```
/// </details>
#[derive(
::serde::Deserialize,
::serde::Serialize,
Clone,
Copy,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
)]
#[non_exhaustive]
pub enum CapabilityManifestConsentClassValue {
#[serde(rename = "normal")]
Normal,
#[serde(rename = "elevated")]
Elevated,
#[serde(rename = "destructive")]
Destructive,
}
impl ::std::fmt::Display for CapabilityManifestConsentClassValue {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match *self {
Self::Normal => f.write_str("normal"),
Self::Elevated => f.write_str("elevated"),
Self::Destructive => f.write_str("destructive"),
}
}
}
impl ::std::str::FromStr for CapabilityManifestConsentClassValue {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
match value {
"normal" => Ok(Self::Normal),
"elevated" => Ok(Self::Elevated),
"destructive" => Ok(Self::Destructive),
_ => Err("invalid value".into()),
}
}
}
impl ::std::convert::TryFrom<&str> for CapabilityManifestConsentClassValue {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for CapabilityManifestConsentClassValue {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for CapabilityManifestConsentClassValue {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
///One-paragraph description for management surfaces.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "One-paragraph description for management surfaces.",
/// "type": "string",
/// "maxLength": 1024
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct CapabilityManifestDescription(::std::string::String);
impl ::std::ops::Deref for CapabilityManifestDescription {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<CapabilityManifestDescription> for ::std::string::String {
fn from(value: CapabilityManifestDescription) -> Self {
value.0
}
}
impl ::std::str::FromStr for CapabilityManifestDescription {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() > 1024usize {
return Err("longer than 1024 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for CapabilityManifestDescription {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for CapabilityManifestDescription {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for CapabilityManifestDescription {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for CapabilityManifestDescription {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`CapabilityManifestExternalAdaptersItem`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "object",
/// "required": [
/// "kind",
/// "ref"
/// ],
/// "properties": {
/// "kind": {
/// "description": "Adapter type, e.g. `github-action`, `webhook`.",
/// "type": "string"
/// },
/// "ref": {
/// "description": "Where the adapter lives, e.g. a repository path or URL.",
/// "type": "string"
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct CapabilityManifestExternalAdaptersItem {
///Adapter type, e.g. `github-action`, `webhook`.
pub kind: ::std::string::String,
///Where the adapter lives, e.g. a repository path or URL.
#[serde(rename = "ref")]
pub ref_: ::std::string::String,
}
impl CapabilityManifestExternalAdaptersItem {
pub fn builder() -> builder::CapabilityManifestExternalAdaptersItem {
Default::default()
}
}
///Human-readable capability name for management surfaces.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Human-readable capability name for management surfaces.",
/// "type": "string",
/// "maxLength": 256
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct CapabilityManifestTitle(::std::string::String);
impl ::std::ops::Deref for CapabilityManifestTitle {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<CapabilityManifestTitle> for ::std::string::String {
fn from(value: CapabilityManifestTitle) -> Self {
value.0
}
}
impl ::std::str::FromStr for CapabilityManifestTitle {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() > 256usize {
return Err("longer than 256 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for CapabilityManifestTitle {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for CapabilityManifestTitle {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for CapabilityManifestTitle {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for CapabilityManifestTitle {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///Manifest/capability version, `MAJOR.MINOR`.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Manifest/capability version, `MAJOR.MINOR`.",
/// "type": "string",
/// "pattern": "^[0-9]+\\.[0-9]+$"
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct CapabilityManifestVersion(::std::string::String);
impl ::std::ops::Deref for CapabilityManifestVersion {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<CapabilityManifestVersion> for ::std::string::String {
fn from(value: CapabilityManifestVersion) -> Self {
value.0
}
}
impl ::std::str::FromStr for CapabilityManifestVersion {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
static PATTERN: ::std::sync::LazyLock<::regress::Regex> =
::std::sync::LazyLock::new(|| ::regress::Regex::new("^[0-9]+\\.[0-9]+$").unwrap());
if PATTERN.find(value).is_none() {
return Err("doesn't match pattern \"^[0-9]+\\.[0-9]+$\"".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for CapabilityManifestVersion {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for CapabilityManifestVersion {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for CapabilityManifestVersion {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for CapabilityManifestVersion {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///The trust-registry tuple vocabulary this capability may read and write. A conforming host MUST reject writes by this capability whose `action` is not listed.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "The trust-registry tuple vocabulary this capability may read and write. A conforming host MUST reject writes by this capability whose `action` is not listed.",
/// "type": "object",
/// "required": [
/// "actions"
/// ],
/// "properties": {
/// "actions": {
/// "description": "TRQP `action` values this capability owns, e.g. `git.commit.sign`.",
/// "type": "array",
/// "items": {
/// "type": "string"
/// },
/// "minItems": 1
/// },
/// "resourcePattern": {
/// "description": "Human-readable pattern of the `resource` values used, e.g. `<org>[/<repo>]`.",
/// "type": "string"
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct CapabilityManifestVocabulary {
///TRQP `action` values this capability owns, e.g. `git.commit.sign`.
pub actions: ::std::vec::Vec<::std::string::String>,
///Human-readable pattern of the `resource` values used, e.g. `<org>[/<repo>]`.
#[serde(
rename = "resourcePattern",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub resource_pattern: ::std::option::Option<::std::string::String>,
}
impl CapabilityManifestVocabulary {
pub fn builder() -> builder::CapabilityManifestVocabulary {
Default::default()
}
}
///Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "Ext",
/// "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
/// "type": "object",
/// "minProperties": 1,
/// "additionalProperties": true,
/// "propertyNames": {
/// "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
/// }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct Ext(pub ::std::collections::HashMap<ExtKey, ::serde_json::Value>);
impl ::std::ops::Deref for Ext {
type Target = ::std::collections::HashMap<ExtKey, ::serde_json::Value>;
fn deref(&self) -> &::std::collections::HashMap<ExtKey, ::serde_json::Value> {
&self.0
}
}
impl ::std::convert::From<Ext> for ::std::collections::HashMap<ExtKey, ::serde_json::Value> {
fn from(value: Ext) -> Self {
value.0
}
}
impl ::std::convert::From<::std::collections::HashMap<ExtKey, ::serde_json::Value>> for Ext {
fn from(value: ::std::collections::HashMap<ExtKey, ::serde_json::Value>) -> Self {
Self(value)
}
}
///`ExtKey`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct ExtKey(::std::string::String);
impl ::std::ops::Deref for ExtKey {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<ExtKey> for ::std::string::String {
fn from(value: ExtKey) -> Self {
value.0
}
}
impl ::std::str::FromStr for ExtKey {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
static PATTERN: ::std::sync::LazyLock<::regress::Regex> =
::std::sync::LazyLock::new(|| {
::regress::Regex::new("^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$").unwrap()
});
if PATTERN.find(value).is_none() {
return Err("doesn't match pattern \"^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$\"".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for ExtKey {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///List a community's capabilities and their manifests — the query behind a capability management surface. Defaults to enabled capabilities only.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "$id": "https://trusttasks.org/spec/governance/capability/list/0.1",
/// "title": "Payload",
/// "description": "List a community's capabilities and their manifests — the query behind a capability management surface. Defaults to enabled capabilities only.",
/// "type": "object",
/// "properties": {
/// "ext": {
/// "$ref": "#/definitions/Ext"
/// },
/// "status": {
/// "description": "Which capabilities to list: `enabled` (the default when absent), `available` (known to the host but not enabled), or `all`.",
/// "type": "string",
/// "enum": [
/// "enabled",
/// "available",
/// "all"
/// ]
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct Payload {
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub ext: ::std::option::Option<Ext>,
///Which capabilities to list: `enabled` (the default when absent), `available` (known to the host but not enabled), or `all`.
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub status: ::std::option::Option<PayloadStatus>,
}
impl ::std::default::Default for Payload {
fn default() -> Self {
Self {
ext: Default::default(),
status: Default::default(),
}
}
}
impl Payload {
pub fn builder() -> builder::Payload {
Default::default()
}
}
///Which capabilities to list: `enabled` (the default when absent), `available` (known to the host but not enabled), or `all`.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Which capabilities to list: `enabled` (the default when absent), `available` (known to the host but not enabled), or `all`.",
/// "type": "string",
/// "enum": [
/// "enabled",
/// "available",
/// "all"
/// ]
///}
/// ```
/// </details>
#[derive(
::serde::Deserialize,
::serde::Serialize,
Clone,
Copy,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
)]
#[non_exhaustive]
pub enum PayloadStatus {
#[serde(rename = "enabled")]
Enabled,
#[serde(rename = "available")]
Available,
#[serde(rename = "all")]
All,
}
impl ::std::fmt::Display for PayloadStatus {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match *self {
Self::Enabled => f.write_str("enabled"),
Self::Available => f.write_str("available"),
Self::All => f.write_str("all"),
}
}
}
impl ::std::str::FromStr for PayloadStatus {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
match value {
"enabled" => Ok(Self::Enabled),
"available" => Ok(Self::Available),
"all" => Ok(Self::All),
_ => Err("invalid value".into()),
}
}
}
impl ::std::convert::TryFrom<&str> for PayloadStatus {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for PayloadStatus {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for PayloadStatus {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
///`Response`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "Response",
/// "type": "object",
/// "required": [
/// "capabilities"
/// ],
/// "properties": {
/// "capabilities": {
/// "type": "array",
/// "items": {
/// "type": "object",
/// "required": [
/// "enabled",
/// "manifest"
/// ],
/// "properties": {
/// "delegate": {
/// "description": "DID of the companion serving this capability, when not built in.",
/// "type": "string"
/// },
/// "enabled": {
/// "type": "boolean"
/// },
/// "enabledAt": {
/// "description": "When the capability was enabled, for enabled entries.",
/// "type": "string",
/// "format": "date-time"
/// },
/// "manifest": {
/// "$ref": "#/definitions/CapabilityManifest"
/// }
/// },
/// "additionalProperties": false
/// }
/// },
/// "ext": {
/// "$ref": "#/definitions/Ext"
/// }
/// },
/// "additionalProperties": false,
/// "$anchor": "response"
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct Response {
pub capabilities: ::std::vec::Vec<ResponseCapabilitiesItem>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub ext: ::std::option::Option<Ext>,
}
impl Response {
pub fn builder() -> builder::Response {
Default::default()
}
}
///`ResponseCapabilitiesItem`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "object",
/// "required": [
/// "enabled",
/// "manifest"
/// ],
/// "properties": {
/// "delegate": {
/// "description": "DID of the companion serving this capability, when not built in.",
/// "type": "string"
/// },
/// "enabled": {
/// "type": "boolean"
/// },
/// "enabledAt": {
/// "description": "When the capability was enabled, for enabled entries.",
/// "type": "string",
/// "format": "date-time"
/// },
/// "manifest": {
/// "$ref": "#/definitions/CapabilityManifest"
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
#[non_exhaustive]
pub struct ResponseCapabilitiesItem {
///DID of the companion serving this capability, when not built in.
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub delegate: ::std::option::Option<::std::string::String>,
pub enabled: bool,
///When the capability was enabled, for enabled entries.
#[serde(
rename = "enabledAt",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub enabled_at: ::std::option::Option<::chrono::DateTime<::chrono::offset::Utc>>,
pub manifest: CapabilityManifest,
}
impl ResponseCapabilitiesItem {
pub fn builder() -> builder::ResponseCapabilitiesItem {
Default::default()
}
}
/// Types for composing complex structures.
pub mod builder {
#[derive(Clone, Debug)]
pub struct CapabilityManifest {
capability:
::std::result::Result<super::CapabilityManifestCapability, ::std::string::String>,
config_schema: ::std::result::Result<
::std::option::Option<::std::string::String>,
::std::string::String,
>,
consent_class: ::std::result::Result<
::std::collections::HashMap<
::std::string::String,
super::CapabilityManifestConsentClassValue,
>,
::std::string::String,
>,
description: ::std::result::Result<
::std::option::Option<super::CapabilityManifestDescription>,
::std::string::String,
>,
ext: ::std::result::Result<::std::option::Option<super::Ext>, ::std::string::String>,
external_adapters: ::std::result::Result<
::std::vec::Vec<super::CapabilityManifestExternalAdaptersItem>,
::std::string::String,
>,
lifecycle_hooks:
::std::result::Result<::std::vec::Vec<::std::string::String>, ::std::string::String>,
roles: ::std::result::Result<
::std::collections::HashMap<
::std::string::String,
::std::vec::Vec<::std::string::String>,
>,
::std::string::String,
>,
specs: ::std::result::Result<::std::vec::Vec<::std::string::String>, ::std::string::String>,
title: ::std::result::Result<
::std::option::Option<super::CapabilityManifestTitle>,
::std::string::String,
>,
version: ::std::result::Result<super::CapabilityManifestVersion, ::std::string::String>,
vocabulary: ::std::result::Result<
::std::option::Option<super::CapabilityManifestVocabulary>,
::std::string::String,
>,
}
impl ::std::default::Default for CapabilityManifest {
fn default() -> Self {
Self {
capability: Err("no value supplied for capability".to_string()),
config_schema: Ok(Default::default()),
consent_class: Ok(Default::default()),
description: Ok(Default::default()),
ext: Ok(Default::default()),
external_adapters: Ok(Default::default()),
lifecycle_hooks: Ok(Default::default()),
roles: Ok(Default::default()),
specs: Err("no value supplied for specs".to_string()),
title: Ok(Default::default()),
version: Err("no value supplied for version".to_string()),
vocabulary: Ok(Default::default()),
}
}
}
impl CapabilityManifest {
pub fn capability<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<super::CapabilityManifestCapability>,
T::Error: ::std::fmt::Display,
{
self.capability = value
.try_into()
.map_err(|e| format!("error converting supplied value for capability: {e}"));
self
}
pub fn config_schema<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.config_schema = value
.try_into()
.map_err(|e| format!("error converting supplied value for config_schema: {e}"));
self
}
pub fn consent_class<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<
::std::collections::HashMap<
::std::string::String,
super::CapabilityManifestConsentClassValue,
>,
>,
T::Error: ::std::fmt::Display,
{
self.consent_class = value
.try_into()
.map_err(|e| format!("error converting supplied value for consent_class: {e}"));
self
}
pub fn description<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::CapabilityManifestDescription>>,
T::Error: ::std::fmt::Display,
{
self.description = value
.try_into()
.map_err(|e| format!("error converting supplied value for description: {e}"));
self
}
pub fn ext<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::Ext>>,
T::Error: ::std::fmt::Display,
{
self.ext = value
.try_into()
.map_err(|e| format!("error converting supplied value for ext: {e}"));
self
}
pub fn external_adapters<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<
::std::vec::Vec<super::CapabilityManifestExternalAdaptersItem>,
>,
T::Error: ::std::fmt::Display,
{
self.external_adapters = value
.try_into()
.map_err(|e| format!("error converting supplied value for external_adapters: {e}"));
self
}
pub fn lifecycle_hooks<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::vec::Vec<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.lifecycle_hooks = value
.try_into()
.map_err(|e| format!("error converting supplied value for lifecycle_hooks: {e}"));
self
}
pub fn roles<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<
::std::collections::HashMap<
::std::string::String,
::std::vec::Vec<::std::string::String>,
>,
>,
T::Error: ::std::fmt::Display,
{
self.roles = value
.try_into()
.map_err(|e| format!("error converting supplied value for roles: {e}"));
self
}
pub fn specs<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::vec::Vec<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.specs = value
.try_into()
.map_err(|e| format!("error converting supplied value for specs: {e}"));
self
}
pub fn title<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::CapabilityManifestTitle>>,
T::Error: ::std::fmt::Display,
{
self.title = value
.try_into()
.map_err(|e| format!("error converting supplied value for title: {e}"));
self
}
pub fn version<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<super::CapabilityManifestVersion>,
T::Error: ::std::fmt::Display,
{
self.version = value
.try_into()
.map_err(|e| format!("error converting supplied value for version: {e}"));
self
}
pub fn vocabulary<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::CapabilityManifestVocabulary>>,
T::Error: ::std::fmt::Display,
{
self.vocabulary = value
.try_into()
.map_err(|e| format!("error converting supplied value for vocabulary: {e}"));
self
}
}
impl ::std::convert::TryFrom<CapabilityManifest> for super::CapabilityManifest {
type Error = super::error::ConversionError;
fn try_from(
value: CapabilityManifest,
) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
capability: value.capability?,
config_schema: value.config_schema?,
consent_class: value.consent_class?,
description: value.description?,
ext: value.ext?,
external_adapters: value.external_adapters?,
lifecycle_hooks: value.lifecycle_hooks?,
roles: value.roles?,
specs: value.specs?,
title: value.title?,
version: value.version?,
vocabulary: value.vocabulary?,
})
}
}
impl ::std::convert::From<super::CapabilityManifest> for CapabilityManifest {
fn from(value: super::CapabilityManifest) -> Self {
Self {
capability: Ok(value.capability),
config_schema: Ok(value.config_schema),
consent_class: Ok(value.consent_class),
description: Ok(value.description),
ext: Ok(value.ext),
external_adapters: Ok(value.external_adapters),
lifecycle_hooks: Ok(value.lifecycle_hooks),
roles: Ok(value.roles),
specs: Ok(value.specs),
title: Ok(value.title),
version: Ok(value.version),
vocabulary: Ok(value.vocabulary),
}
}
}
#[derive(Clone, Debug)]
pub struct CapabilityManifestExternalAdaptersItem {
kind: ::std::result::Result<::std::string::String, ::std::string::String>,
ref_: ::std::result::Result<::std::string::String, ::std::string::String>,
}
impl ::std::default::Default for CapabilityManifestExternalAdaptersItem {
fn default() -> Self {
Self {
kind: Err("no value supplied for kind".to_string()),
ref_: Err("no value supplied for ref_".to_string()),
}
}
}
impl CapabilityManifestExternalAdaptersItem {
pub fn kind<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::string::String>,
T::Error: ::std::fmt::Display,
{
self.kind = value
.try_into()
.map_err(|e| format!("error converting supplied value for kind: {e}"));
self
}
pub fn ref_<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::string::String>,
T::Error: ::std::fmt::Display,
{
self.ref_ = value
.try_into()
.map_err(|e| format!("error converting supplied value for ref_: {e}"));
self
}
}
impl ::std::convert::TryFrom<CapabilityManifestExternalAdaptersItem>
for super::CapabilityManifestExternalAdaptersItem
{
type Error = super::error::ConversionError;
fn try_from(
value: CapabilityManifestExternalAdaptersItem,
) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
kind: value.kind?,
ref_: value.ref_?,
})
}
}
impl ::std::convert::From<super::CapabilityManifestExternalAdaptersItem>
for CapabilityManifestExternalAdaptersItem
{
fn from(value: super::CapabilityManifestExternalAdaptersItem) -> Self {
Self {
kind: Ok(value.kind),
ref_: Ok(value.ref_),
}
}
}
#[derive(Clone, Debug)]
pub struct CapabilityManifestVocabulary {
actions:
::std::result::Result<::std::vec::Vec<::std::string::String>, ::std::string::String>,
resource_pattern: ::std::result::Result<
::std::option::Option<::std::string::String>,
::std::string::String,
>,
}
impl ::std::default::Default for CapabilityManifestVocabulary {
fn default() -> Self {
Self {
actions: Err("no value supplied for actions".to_string()),
resource_pattern: Ok(Default::default()),
}
}
}
impl CapabilityManifestVocabulary {
pub fn actions<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::vec::Vec<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.actions = value
.try_into()
.map_err(|e| format!("error converting supplied value for actions: {e}"));
self
}
pub fn resource_pattern<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.resource_pattern = value
.try_into()
.map_err(|e| format!("error converting supplied value for resource_pattern: {e}"));
self
}
}
impl ::std::convert::TryFrom<CapabilityManifestVocabulary> for super::CapabilityManifestVocabulary {
type Error = super::error::ConversionError;
fn try_from(
value: CapabilityManifestVocabulary,
) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
actions: value.actions?,
resource_pattern: value.resource_pattern?,
})
}
}
impl ::std::convert::From<super::CapabilityManifestVocabulary> for CapabilityManifestVocabulary {
fn from(value: super::CapabilityManifestVocabulary) -> Self {
Self {
actions: Ok(value.actions),
resource_pattern: Ok(value.resource_pattern),
}
}
}
#[derive(Clone, Debug)]
pub struct Payload {
ext: ::std::result::Result<::std::option::Option<super::Ext>, ::std::string::String>,
status: ::std::result::Result<
::std::option::Option<super::PayloadStatus>,
::std::string::String,
>,
}
impl ::std::default::Default for Payload {
fn default() -> Self {
Self {
ext: Ok(Default::default()),
status: Ok(Default::default()),
}
}
}
impl Payload {
pub fn ext<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::Ext>>,
T::Error: ::std::fmt::Display,
{
self.ext = value
.try_into()
.map_err(|e| format!("error converting supplied value for ext: {e}"));
self
}
pub fn status<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::PayloadStatus>>,
T::Error: ::std::fmt::Display,
{
self.status = value
.try_into()
.map_err(|e| format!("error converting supplied value for status: {e}"));
self
}
}
impl ::std::convert::TryFrom<Payload> for super::Payload {
type Error = super::error::ConversionError;
fn try_from(value: Payload) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
ext: value.ext?,
status: value.status?,
})
}
}
impl ::std::convert::From<super::Payload> for Payload {
fn from(value: super::Payload) -> Self {
Self {
ext: Ok(value.ext),
status: Ok(value.status),
}
}
}
#[derive(Clone, Debug)]
pub struct Response {
capabilities: ::std::result::Result<
::std::vec::Vec<super::ResponseCapabilitiesItem>,
::std::string::String,
>,
ext: ::std::result::Result<::std::option::Option<super::Ext>, ::std::string::String>,
}
impl ::std::default::Default for Response {
fn default() -> Self {
Self {
capabilities: Err("no value supplied for capabilities".to_string()),
ext: Ok(Default::default()),
}
}
}
impl Response {
pub fn capabilities<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::vec::Vec<super::ResponseCapabilitiesItem>>,
T::Error: ::std::fmt::Display,
{
self.capabilities = value
.try_into()
.map_err(|e| format!("error converting supplied value for capabilities: {e}"));
self
}
pub fn ext<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<super::Ext>>,
T::Error: ::std::fmt::Display,
{
self.ext = value
.try_into()
.map_err(|e| format!("error converting supplied value for ext: {e}"));
self
}
}
impl ::std::convert::TryFrom<Response> for super::Response {
type Error = super::error::ConversionError;
fn try_from(value: Response) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
capabilities: value.capabilities?,
ext: value.ext?,
})
}
}
impl ::std::convert::From<super::Response> for Response {
fn from(value: super::Response) -> Self {
Self {
capabilities: Ok(value.capabilities),
ext: Ok(value.ext),
}
}
}
#[derive(Clone, Debug)]
pub struct ResponseCapabilitiesItem {
delegate: ::std::result::Result<
::std::option::Option<::std::string::String>,
::std::string::String,
>,
enabled: ::std::result::Result<bool, ::std::string::String>,
enabled_at: ::std::result::Result<
::std::option::Option<::chrono::DateTime<::chrono::offset::Utc>>,
::std::string::String,
>,
manifest: ::std::result::Result<super::CapabilityManifest, ::std::string::String>,
}
impl ::std::default::Default for ResponseCapabilitiesItem {
fn default() -> Self {
Self {
delegate: Ok(Default::default()),
enabled: Err("no value supplied for enabled".to_string()),
enabled_at: Ok(Default::default()),
manifest: Err("no value supplied for manifest".to_string()),
}
}
}
impl ResponseCapabilitiesItem {
pub fn delegate<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<::std::option::Option<::std::string::String>>,
T::Error: ::std::fmt::Display,
{
self.delegate = value
.try_into()
.map_err(|e| format!("error converting supplied value for delegate: {e}"));
self
}
pub fn enabled<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<bool>,
T::Error: ::std::fmt::Display,
{
self.enabled = value
.try_into()
.map_err(|e| format!("error converting supplied value for enabled: {e}"));
self
}
pub fn enabled_at<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<
::std::option::Option<::chrono::DateTime<::chrono::offset::Utc>>,
>,
T::Error: ::std::fmt::Display,
{
self.enabled_at = value
.try_into()
.map_err(|e| format!("error converting supplied value for enabled_at: {e}"));
self
}
pub fn manifest<T>(mut self, value: T) -> Self
where
T: ::std::convert::TryInto<super::CapabilityManifest>,
T::Error: ::std::fmt::Display,
{
self.manifest = value
.try_into()
.map_err(|e| format!("error converting supplied value for manifest: {e}"));
self
}
}
impl ::std::convert::TryFrom<ResponseCapabilitiesItem> for super::ResponseCapabilitiesItem {
type Error = super::error::ConversionError;
fn try_from(
value: ResponseCapabilitiesItem,
) -> ::std::result::Result<Self, super::error::ConversionError> {
Ok(Self {
delegate: value.delegate?,
enabled: value.enabled?,
enabled_at: value.enabled_at?,
manifest: value.manifest?,
})
}
}
impl ::std::convert::From<super::ResponseCapabilitiesItem> for ResponseCapabilitiesItem {
fn from(value: super::ResponseCapabilitiesItem) -> Self {
Self {
delegate: Ok(value.delegate),
enabled: Ok(value.enabled),
enabled_at: Ok(value.enabled_at),
manifest: Ok(value.manifest),
}
}
}
}
impl crate::Payload for Payload {
const TYPE_URI: &'static str = "https://trusttasks.org/spec/governance/capability/list/0.1";
const IS_RECIPIENT_REQUIRED: bool = true;
const PAYLOAD_SCHEMA: Option<&'static str> = Some(
"{\n \"$defs\": {\n \"CapabilityManifest\": {\n \"additionalProperties\": false,\n \"description\": \"The self-description of a pluggable community capability: the Trust Task families it serves, the trust-registry vocabulary it reads and writes, the roles that may operate it, the membership lifecycle hooks it consumes, and the external adapters that act on its decisions. The manifest is what governance approves, what discovery advertises, and what a management UX renders.\",\n \"properties\": {\n \"capability\": {\n \"description\": \"The capability's namespace slug, e.g. `git-trust`.\",\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\",\n \"type\": \"string\"\n },\n \"configSchema\": {\n \"description\": \"Spec slug of the JSON schema the per-community `config` document must validate against.\",\n \"type\": \"string\"\n },\n \"consentClass\": {\n \"additionalProperties\": {\n \"enum\": [\n \"normal\",\n \"elevated\",\n \"destructive\"\n ],\n \"type\": \"string\"\n },\n \"description\": \"Map of capability operation to the consent class its execution requires under the host's delegated-execution policy.\",\n \"type\": \"object\"\n },\n \"description\": {\n \"description\": \"One-paragraph description for management surfaces.\",\n \"maxLength\": 1024,\n \"type\": \"string\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n },\n \"externalAdapters\": {\n \"description\": \"Out-of-stack components that consume this capability's trust decisions.\",\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"description\": \"Adapter type, e.g. `github-action`, `webhook`.\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"description\": \"Where the adapter lives, e.g. a repository path or URL.\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"lifecycleHooks\": {\n \"description\": \"Membership lifecycle events the capability consumes, e.g. `member.enrolled`, `member.revoked`, `role.changed`.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"roles\": {\n \"additionalProperties\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"description\": \"Map of capability operation (e.g. `grant`, `view`) to the community roles allowed to perform it.\",\n \"type\": \"object\"\n },\n \"specs\": {\n \"description\": \"Trust Task spec slugs (or `<family>/*` globs) this capability serves when enabled.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"title\": {\n \"description\": \"Human-readable capability name for management surfaces.\",\n \"maxLength\": 256,\n \"type\": \"string\"\n },\n \"version\": {\n \"description\": \"Manifest/capability version, `MAJOR.MINOR`.\",\n \"pattern\": \"^[0-9]+\\\\.[0-9]+$\",\n \"type\": \"string\"\n },\n \"vocabulary\": {\n \"additionalProperties\": false,\n \"description\": \"The trust-registry tuple vocabulary this capability may read and write. A conforming host MUST reject writes by this capability whose `action` is not listed.\",\n \"properties\": {\n \"actions\": {\n \"description\": \"TRQP `action` values this capability owns, e.g. `git.commit.sign`.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"resourcePattern\": {\n \"description\": \"Human-readable pattern of the `resource` values used, e.g. `<org>[/<repo>]`.\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"actions\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"capability\",\n \"version\",\n \"specs\"\n ],\n \"title\": \"CapabilityManifest\",\n \"type\": \"object\"\n },\n \"Ext\": {\n \"additionalProperties\": true,\n \"description\": \"Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.\",\n \"minProperties\": 1,\n \"propertyNames\": {\n \"pattern\": \"^[a-z][a-z0-9-]*(\\\\.[a-z0-9-]+)+$\"\n },\n \"title\": \"Ext\",\n \"type\": \"object\"\n },\n \"Response\": {\n \"$anchor\": \"response\",\n \"additionalProperties\": false,\n \"properties\": {\n \"capabilities\": {\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"delegate\": {\n \"description\": \"DID of the companion serving this capability, when not built in.\",\n \"type\": \"string\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"enabledAt\": {\n \"description\": \"When the capability was enabled, for enabled entries.\",\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n \"manifest\": {\n \"$ref\": \"#/$defs/CapabilityManifest\"\n }\n },\n \"required\": [\n \"manifest\",\n \"enabled\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n }\n },\n \"required\": [\n \"capabilities\"\n ],\n \"title\": \"Governance Capability List — response payload\",\n \"type\": \"object\"\n }\n },\n \"$id\": \"https://trusttasks.org/spec/governance/capability/list/0.1\",\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"additionalProperties\": false,\n \"description\": \"List a community's capabilities and their manifests — the query behind a capability management surface. Defaults to enabled capabilities only.\",\n \"properties\": {\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n },\n \"status\": {\n \"description\": \"Which capabilities to list: `enabled` (the default when absent), `available` (known to the host but not enabled), or `all`.\",\n \"enum\": [\n \"enabled\",\n \"available\",\n \"all\"\n ],\n \"type\": \"string\"\n }\n },\n \"title\": \"Governance Capability List — payload\",\n \"type\": \"object\"\n}\n",
);
}
impl crate::Payload for Response {
const TYPE_URI: &'static str =
"https://trusttasks.org/spec/governance/capability/list/0.1#response";
const IS_RECIPIENT_REQUIRED: bool = true;
const PAYLOAD_SCHEMA: Option<&'static str> = Some(
"{\n \"$defs\": {\n \"CapabilityManifest\": {\n \"additionalProperties\": false,\n \"description\": \"The self-description of a pluggable community capability: the Trust Task families it serves, the trust-registry vocabulary it reads and writes, the roles that may operate it, the membership lifecycle hooks it consumes, and the external adapters that act on its decisions. The manifest is what governance approves, what discovery advertises, and what a management UX renders.\",\n \"properties\": {\n \"capability\": {\n \"description\": \"The capability's namespace slug, e.g. `git-trust`.\",\n \"pattern\": \"^[a-z0-9][a-z0-9-]*$\",\n \"type\": \"string\"\n },\n \"configSchema\": {\n \"description\": \"Spec slug of the JSON schema the per-community `config` document must validate against.\",\n \"type\": \"string\"\n },\n \"consentClass\": {\n \"additionalProperties\": {\n \"enum\": [\n \"normal\",\n \"elevated\",\n \"destructive\"\n ],\n \"type\": \"string\"\n },\n \"description\": \"Map of capability operation to the consent class its execution requires under the host's delegated-execution policy.\",\n \"type\": \"object\"\n },\n \"description\": {\n \"description\": \"One-paragraph description for management surfaces.\",\n \"maxLength\": 1024,\n \"type\": \"string\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n },\n \"externalAdapters\": {\n \"description\": \"Out-of-stack components that consume this capability's trust decisions.\",\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"description\": \"Adapter type, e.g. `github-action`, `webhook`.\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"description\": \"Where the adapter lives, e.g. a repository path or URL.\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"lifecycleHooks\": {\n \"description\": \"Membership lifecycle events the capability consumes, e.g. `member.enrolled`, `member.revoked`, `role.changed`.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"roles\": {\n \"additionalProperties\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"description\": \"Map of capability operation (e.g. `grant`, `view`) to the community roles allowed to perform it.\",\n \"type\": \"object\"\n },\n \"specs\": {\n \"description\": \"Trust Task spec slugs (or `<family>/*` globs) this capability serves when enabled.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"title\": {\n \"description\": \"Human-readable capability name for management surfaces.\",\n \"maxLength\": 256,\n \"type\": \"string\"\n },\n \"version\": {\n \"description\": \"Manifest/capability version, `MAJOR.MINOR`.\",\n \"pattern\": \"^[0-9]+\\\\.[0-9]+$\",\n \"type\": \"string\"\n },\n \"vocabulary\": {\n \"additionalProperties\": false,\n \"description\": \"The trust-registry tuple vocabulary this capability may read and write. A conforming host MUST reject writes by this capability whose `action` is not listed.\",\n \"properties\": {\n \"actions\": {\n \"description\": \"TRQP `action` values this capability owns, e.g. `git.commit.sign`.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1,\n \"type\": \"array\"\n },\n \"resourcePattern\": {\n \"description\": \"Human-readable pattern of the `resource` values used, e.g. `<org>[/<repo>]`.\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"actions\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"capability\",\n \"version\",\n \"specs\"\n ],\n \"title\": \"CapabilityManifest\",\n \"type\": \"object\"\n },\n \"Ext\": {\n \"additionalProperties\": true,\n \"description\": \"Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.\",\n \"minProperties\": 1,\n \"propertyNames\": {\n \"pattern\": \"^[a-z][a-z0-9-]*(\\\\.[a-z0-9-]+)+$\"\n },\n \"title\": \"Ext\",\n \"type\": \"object\"\n },\n \"Response\": {\n \"$anchor\": \"response\",\n \"additionalProperties\": false,\n \"properties\": {\n \"capabilities\": {\n \"items\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"delegate\": {\n \"description\": \"DID of the companion serving this capability, when not built in.\",\n \"type\": \"string\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"enabledAt\": {\n \"description\": \"When the capability was enabled, for enabled entries.\",\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n \"manifest\": {\n \"$ref\": \"#/$defs/CapabilityManifest\"\n }\n },\n \"required\": [\n \"manifest\",\n \"enabled\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n }\n },\n \"required\": [\n \"capabilities\"\n ],\n \"title\": \"Governance Capability List — response payload\",\n \"type\": \"object\"\n }\n },\n \"$ref\": \"#/$defs/Response\",\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\"\n}\n",
);
}
impl crate::RequestPayload for Payload {
type Response = Response;
}
#[cfg(test)]
mod conformance {
//! Round-trip tests harvested from the spec's `spec.md`,
//! plus a `rejects_invalid_examples` test for any fixtures
//! in `payload.invalid-examples.json` (validate feature).
/// Each fixture in `payload.invalid-examples.json` MUST be
/// rejected by at least one of: serde deserialization, or
/// JSON-Schema validation under the `validate` feature. The
/// fixture file documents the producer-side bug class that
/// each payload exemplifies; this generated test pins it.
#[cfg(feature = "validate")]
#[test]
fn rejects_invalid_examples() {
use crate::validate::ValidatedPayload;
let fixtures: &[(&str, &str)] = &[
(
"Unknown top-level member is rejected (additionalProperties: false).",
"{\n \"__notARealMember__\": true\n}",
),
(
"status must be one of the enum values.",
"{\n \"status\": \"everything\"\n}",
),
("status must be a string.", "{\n \"status\": 1\n}"),
];
for (i, (note, raw)) in fixtures.iter().enumerate() {
let value: serde_json::Value = match serde_json::from_str(raw) {
Ok(v) => v,
Err(_) => continue,
};
let serde_ok = serde_json::from_value::<super::Payload>(value.clone()).is_ok();
let schema_ok = super::Payload::validate_value(&value).is_ok();
assert!(
!(serde_ok && schema_ok),
"invalid-example #{} ({:?}) was accepted by both serde and JSON Schema; \
the fixture's stated failure class is no longer caught:\n{}",
i + 1,
note,
raw
);
}
}
}