pub struct GitLabClient { /* private fields */ }Implementations§
Source§impl GitLabClient
impl GitLabClient
Sourcepub fn new(project_id: impl Into<String>, token: SecretString) -> Self
pub fn new(project_id: impl Into<String>, token: SecretString) -> Self
Create a new GitLab client.
Sourcepub fn with_base_url(
base_url: impl Into<String>,
project_id: impl Into<String>,
token: SecretString,
) -> Self
pub fn with_base_url( base_url: impl Into<String>, project_id: impl Into<String>, token: SecretString, ) -> Self
Create a new GitLab client with a custom base URL.
Sourcepub fn with_auth_scheme(self, scheme: AuthScheme) -> Self
pub fn with_auth_scheme(self, scheme: AuthScheme) -> Self
Override the auth header scheme. By default AuthScheme::Auto
is used (detect by GitLab token prefix). Use this when the
caller already knows whether the token is a PAT or an OAuth
access_token — avoids relying on prefix heuristics for tokens
from non-standard GitLab distributions.
Sourcepub fn base_url(&self) -> &str
pub fn base_url(&self) -> &str
Base URL the client was configured against. Public so the liveness probe (and any future sibling module) can build its own requests without re-walking the constructor.
Sourcepub fn http_client(&self) -> &Client
pub fn http_client(&self) -> &Client
Borrow the underlying reqwest::Client. Same rationale as
Self::base_url.
Sourcepub fn with_proxy(self, headers: HashMap<String, String>) -> Self
pub fn with_proxy(self, headers: HashMap<String, String>) -> Self
Configure proxy mode with extra headers added to every request.
When proxy is active, the provider’s own auth header (PRIVATE-TOKEN)
is suppressed — the proxy handles authentication.
Trait Implementations§
Source§impl IssueProvider for GitLabClient
impl IssueProvider for GitLabClient
Source§fn get_issues<'life0, 'async_trait>(
&'life0 self,
filter: IssueFilter,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Issue>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_issues<'life0, 'async_trait>(
&'life0 self,
filter: IssueFilter,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Issue>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get_issue<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_issue<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn create_issue<'life0, 'async_trait>(
&'life0 self,
input: CreateIssueInput,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create_issue<'life0, 'async_trait>(
&'life0 self,
input: CreateIssueInput,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn update_issue<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
input: UpdateIssueInput,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn update_issue<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
input: UpdateIssueInput,
) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_comments<'life0, 'life1, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Comment>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn add_comment<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
body: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Comment>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn upload_attachment<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
filename: &'life2 str,
data: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn upload_attachment<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
filename: &'life2 str,
data: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn get_issue_attachments<'life0, 'life1, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<AssetMeta>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_issue_attachments<'life0, 'life1, 'async_trait>(
&'life0 self,
issue_key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<AssetMeta>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn download_attachment<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
asset_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn download_attachment<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
asset_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn asset_capabilities(&self) -> AssetCapabilities
fn asset_capabilities(&self) -> AssetCapabilities
ProviderUnsupported.Source§fn provider_name(&self) -> &'static str
fn provider_name(&self) -> &'static str
Source§fn get_statuses<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<IssueStatus>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_statuses<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<IssueStatus>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn link_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_source_key: &'life1 str,
_target_key: &'life2 str,
_link_type: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
fn link_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_source_key: &'life1 str,
_target_key: &'life2 str,
_link_type: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
Source§fn unlink_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_source_key: &'life1 str,
_target_key: &'life2 str,
_link_type: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
fn unlink_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_source_key: &'life1 str,
_target_key: &'life2 str,
_link_type: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
Source§fn get_users<'life0, 'async_trait>(
&'life0 self,
_options: GetUsersOptions,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<User>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_users<'life0, 'async_trait>(
&'life0 self,
_options: GetUsersOptions,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<User>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn delete_attachment<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
_asset_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
fn delete_attachment<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
_asset_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
Source§fn set_custom_fields<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
_fields: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
fn set_custom_fields<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
_fields: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
{"id": "field_id", "value": <value>}.
Default is no-op — override in providers that support custom fields (e.g., ClickUp).Source§fn get_issue_relations<'life0, 'life1, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<IssueRelations, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn get_issue_relations<'life0, 'life1, 'async_trait>(
&'life0 self,
_issue_key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<IssueRelations, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Source§fn get_structures<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Structure>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_structures<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Structure>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn get_structure_forest<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_options: GetForestOptions,
) -> Pin<Box<dyn Future<Output = Result<StructureForest, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_structure_forest<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_options: GetForestOptions,
) -> Pin<Box<dyn Future<Output = Result<StructureForest, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn add_structure_rows<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_input: AddStructureRowsInput,
) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn add_structure_rows<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_input: AddStructureRowsInput,
) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn move_structure_rows<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_input: MoveStructureRowsInput,
) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn move_structure_rows<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_input: MoveStructureRowsInput,
) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn remove_structure_row<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_row_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn remove_structure_row<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_row_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn get_structure_values<'life0, 'async_trait>(
&'life0 self,
_input: GetStructureValuesInput,
) -> Pin<Box<dyn Future<Output = Result<StructureValues, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_structure_values<'life0, 'async_trait>(
&'life0 self,
_input: GetStructureValuesInput,
) -> Pin<Box<dyn Future<Output = Result<StructureValues, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn get_structure_views<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_view_id: Option<u64>,
) -> Pin<Box<dyn Future<Output = Result<Vec<StructureView>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_structure_views<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
_view_id: Option<u64>,
) -> Pin<Box<dyn Future<Output = Result<Vec<StructureView>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn save_structure_view<'life0, 'async_trait>(
&'life0 self,
_input: SaveStructureViewInput,
) -> Pin<Box<dyn Future<Output = Result<StructureView, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn save_structure_view<'life0, 'async_trait>(
&'life0 self,
_input: SaveStructureViewInput,
) -> Pin<Box<dyn Future<Output = Result<StructureView, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn create_structure<'life0, 'async_trait>(
&'life0 self,
_input: CreateStructureInput,
) -> Pin<Box<dyn Future<Output = Result<Structure, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn create_structure<'life0, 'async_trait>(
&'life0 self,
_input: CreateStructureInput,
) -> Pin<Box<dyn Future<Output = Result<Structure, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn get_structure_generators<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<StructureGenerator>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_structure_generators<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<StructureGenerator>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn add_structure_generator<'life0, 'async_trait>(
&'life0 self,
_input: AddStructureGeneratorInput,
) -> Pin<Box<dyn Future<Output = Result<StructureGenerator, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn add_structure_generator<'life0, 'async_trait>(
&'life0 self,
_input: AddStructureGeneratorInput,
) -> Pin<Box<dyn Future<Output = Result<StructureGenerator, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn sync_structure_generator<'life0, 'async_trait>(
&'life0 self,
_input: SyncStructureGeneratorInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn sync_structure_generator<'life0, 'async_trait>(
&'life0 self,
_input: SyncStructureGeneratorInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn delete_structure<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn delete_structure<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn update_structure_automation<'life0, 'async_trait>(
&'life0 self,
_input: UpdateStructureAutomationInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn update_structure_automation<'life0, 'async_trait>(
&'life0 self,
_input: UpdateStructureAutomationInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn trigger_structure_automation<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn trigger_structure_automation<'life0, 'async_trait>(
&'life0 self,
_structure_id: u64,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn list_project_versions<'life0, 'async_trait>(
&'life0 self,
_params: ListProjectVersionsParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<ProjectVersion>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn list_project_versions<'life0, 'async_trait>(
&'life0 self,
_params: ListProjectVersionsParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<ProjectVersion>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fixVersion targets) for a project.
Default: ProviderUnsupported.Source§fn upsert_project_version<'life0, 'async_trait>(
&'life0 self,
_input: UpsertProjectVersionInput,
) -> Pin<Box<dyn Future<Output = Result<ProjectVersion, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn upsert_project_version<'life0, 'async_trait>(
&'life0 self,
_input: UpsertProjectVersionInput,
) -> Pin<Box<dyn Future<Output = Result<ProjectVersion, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
(project, name).
Partial update: optional fields left as None are not touched.
Default: ProviderUnsupported.Source§fn get_board_sprints<'life0, 'async_trait>(
&'life0 self,
_board_id: u64,
_state: SprintState,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Sprint>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn get_board_sprints<'life0, 'async_trait>(
&'life0 self,
_board_id: u64,
_state: SprintState,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Sprint>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn assign_to_sprint<'life0, 'async_trait>(
&'life0 self,
_input: AssignToSprintInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn assign_to_sprint<'life0, 'async_trait>(
&'life0 self,
_input: AssignToSprintInput,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn list_custom_fields<'life0, 'async_trait>(
&'life0 self,
_params: ListCustomFieldsParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<CustomFieldDescriptor>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn list_custom_fields<'life0, 'async_trait>(
&'life0 self,
_params: ListCustomFieldsParams,
) -> Pin<Box<dyn Future<Output = Result<ProviderResult<CustomFieldDescriptor>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
customfield_* ids of an instance
without hardcoding them. Default impl returns
ProviderUnsupported — providers without a real customfield
concept (GitHub, GitLab) keep that default.Source§impl LivenessProbe for GitLabClient
impl LivenessProbe for GitLabClient
Source§fn provider_name(&self) -> &str
fn provider_name(&self) -> &str
NotImplemented
default and in doctor output. Concrete impls override
to return e.g. "github", "gitlab".Source§fn test<'life0, 'life1, 'async_trait>(
&'life0 self,
token: &'life1 SecretString,
) -> Pin<Box<dyn Future<Output = Result<LivenessResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn test<'life0, 'life1, 'async_trait>(
&'life0 self,
token: &'life1 SecretString,
) -> Pin<Box<dyn Future<Output = Result<LivenessResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
token. The default impl returns
NotImplemented so providers without a native
introspection endpoint can opt-in trivially.