use super::{
CapabilityCardinality, CapabilityEndpointPlan, EventAdmissionPlan, ExecutionClassId,
ExecutionLaneId, PluginCriticality, RequestAdmissionPlan, RestartPolicy, schema,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(from = "schema::RequirementWire")]
pub struct CapabilityRequirementPlan {
#[serde(default)]
pub(super) requirement_id: String,
pub(super) capability_id: String,
pub(super) descriptor_version: String,
pub(super) cardinality: CapabilityCardinality,
}
impl CapabilityRequirementPlan {
pub fn new(
capability_id: impl Into<String>,
descriptor_version: impl Into<String>,
cardinality: CapabilityCardinality,
) -> Self {
let capability_id = capability_id.into();
Self {
requirement_id: format!("~{capability_id}"),
capability_id,
descriptor_version: descriptor_version.into(),
cardinality,
}
}
pub fn one(capability_id: impl Into<String>, descriptor_version: impl Into<String>) -> Self {
Self::new(
capability_id,
descriptor_version,
CapabilityCardinality::One,
)
}
pub fn optional(
capability_id: impl Into<String>,
descriptor_version: impl Into<String>,
) -> Self {
Self::new(
capability_id,
descriptor_version,
CapabilityCardinality::Optional,
)
}
pub fn many(capability_id: impl Into<String>, descriptor_version: impl Into<String>) -> Self {
Self::new(
capability_id,
descriptor_version,
CapabilityCardinality::Many,
)
}
#[must_use]
pub fn with_requirement_id(mut self, requirement_id: impl Into<String>) -> Self {
self.requirement_id = requirement_id.into();
self
}
pub fn requirement_id(&self) -> &str {
&self.requirement_id
}
pub fn capability_id(&self) -> &str {
&self.capability_id
}
pub fn descriptor_version(&self) -> &str {
&self.descriptor_version
}
pub const fn cardinality(&self) -> CapabilityCardinality {
self.cardinality
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct PluginInstancePlan {
#[serde(default = "schema::old_authoring_version")]
pub(super) authoring_version: u32,
#[serde(default)]
pub(super) runtime_profile: String,
pub(super) instance_key: String,
pub(super) package_id: String,
pub(super) entrypoint: String,
pub(super) configuration: String,
pub(super) provided_capabilities: Vec<CapabilityEndpointPlan>,
pub(super) required_capabilities: Vec<CapabilityRequirementPlan>,
pub(super) execution_class: ExecutionClassId,
pub(super) package_revision: String,
pub(super) restart_policy: RestartPolicy,
pub(super) criticality: PluginCriticality,
#[serde(default)]
pub(super) execution_lane: ExecutionLaneId,
}
impl PluginInstancePlan {
pub fn new(instance_key: impl Into<String>, package_id: impl Into<String>) -> Self {
Self {
authoring_version: 1,
runtime_profile: "lenso.native-authoring@1".to_owned(),
instance_key: instance_key.into(),
package_id: package_id.into(),
entrypoint: "default".to_owned(),
configuration: "{}".to_owned(),
provided_capabilities: Vec::new(),
required_capabilities: Vec::new(),
execution_class: ExecutionClassId::native_rust(),
package_revision: String::new(),
restart_policy: RestartPolicy::default(),
criticality: PluginCriticality::default(),
execution_lane: ExecutionLaneId::default(),
}
}
#[must_use]
pub fn with_authoring(mut self, version: u32, runtime_profile: impl Into<String>) -> Self {
self.authoring_version = version;
self.runtime_profile = runtime_profile.into();
self
}
pub const fn authoring_version(&self) -> u32 {
self.authoring_version
}
pub fn runtime_profile(&self) -> &str {
&self.runtime_profile
}
#[must_use]
pub fn with_entrypoint(mut self, entrypoint: impl Into<String>) -> Self {
self.entrypoint = entrypoint.into();
self
}
#[must_use]
pub fn with_configuration(mut self, configuration: impl Into<String>) -> Self {
self.configuration = configuration.into();
self
}
#[must_use]
pub fn with_capability(mut self, capability: CapabilityEndpointPlan) -> Self {
self.provided_capabilities.push(capability);
self
}
#[must_use]
pub fn with_requirement(mut self, requirement: CapabilityRequirementPlan) -> Self {
self.required_capabilities.push(requirement);
self
}
#[must_use]
pub fn with_required_capability(self, requirement: CapabilityRequirementPlan) -> Self {
self.with_requirement(requirement)
}
#[must_use]
pub fn with_execution_class(mut self, execution_class: ExecutionClassId) -> Self {
if self.authoring_version == 1
&& self.runtime_profile == schema::old_runtime_profile(&self.execution_class)
{
self.runtime_profile = schema::old_runtime_profile(&execution_class);
}
self.execution_class = execution_class;
self
}
#[must_use]
pub fn with_execution_lane(mut self, execution_lane: ExecutionLaneId) -> Self {
self.execution_lane = execution_lane;
self
}
#[must_use]
pub fn with_package_revision(mut self, revision: impl Into<String>) -> Self {
self.package_revision = revision.into();
self
}
#[must_use]
pub fn with_restart_policy(mut self, restart_policy: RestartPolicy) -> Self {
self.restart_policy = restart_policy;
self
}
#[must_use]
pub fn with_criticality(mut self, criticality: PluginCriticality) -> Self {
self.criticality = criticality;
self
}
pub fn instance_key(&self) -> &str {
&self.instance_key
}
pub fn package_id(&self) -> &str {
&self.package_id
}
pub fn entrypoint(&self) -> &str {
&self.entrypoint
}
pub fn configuration(&self) -> &str {
&self.configuration
}
pub fn provided_capabilities(&self) -> &[CapabilityEndpointPlan] {
&self.provided_capabilities
}
pub fn required_capabilities(&self) -> &[CapabilityRequirementPlan] {
&self.required_capabilities
}
pub fn execution_class(&self) -> &ExecutionClassId {
&self.execution_class
}
pub const fn execution_lane(&self) -> &ExecutionLaneId {
&self.execution_lane
}
pub fn package_revision(&self) -> &str {
&self.package_revision
}
pub const fn restart_policy(&self) -> RestartPolicy {
self.restart_policy
}
pub const fn criticality(&self) -> PluginCriticality {
self.criticality
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(from = "schema::BindingWire")]
pub struct CapabilityBinding {
#[serde(default)]
pub(super) requirement_id: String,
pub(super) consumer_instance: String,
pub(super) capability_id: String,
pub(super) descriptor_version: String,
pub(super) provider_instance: String,
pub(super) provider_order: usize,
pub(super) admission: RequestAdmissionPlan,
pub(super) admission_explicit: bool,
pub(super) event_admission: EventAdmissionPlan,
pub(super) event_admission_explicit: bool,
}
impl CapabilityBinding {
pub fn new(
consumer_instance: impl Into<String>,
capability_id: impl Into<String>,
descriptor_version: impl Into<String>,
provider_instance: impl Into<String>,
) -> Self {
let capability_id = capability_id.into();
Self {
requirement_id: format!("~{capability_id}"),
consumer_instance: consumer_instance.into(),
capability_id,
descriptor_version: descriptor_version.into(),
provider_instance: provider_instance.into(),
provider_order: 0,
admission: RequestAdmissionPlan::default(),
admission_explicit: false,
event_admission: EventAdmissionPlan::default(),
event_admission_explicit: false,
}
}
#[must_use]
pub fn with_requirement_id(mut self, requirement_id: impl Into<String>) -> Self {
self.requirement_id = requirement_id.into();
self
}
pub fn requirement_id(&self) -> &str {
&self.requirement_id
}
#[must_use]
pub fn with_admission(mut self, admission: RequestAdmissionPlan) -> Self {
self.admission = admission;
self.admission_explicit = true;
self
}
#[must_use]
pub fn with_limits(self, queue_capacity: usize, max_concurrency: usize) -> Self {
self.with_admission(RequestAdmissionPlan::new(queue_capacity, max_concurrency))
}
#[must_use]
pub fn with_event_admission(mut self, admission: EventAdmissionPlan) -> Self {
self.event_admission = admission;
self.event_admission_explicit = true;
self
}
#[must_use]
pub fn with_event_capacity(self, capacity: usize) -> Self {
self.with_event_admission(EventAdmissionPlan::new(capacity))
}
pub(super) fn with_provider_order(mut self, provider_order: usize) -> Self {
self.provider_order = provider_order;
self
}
pub fn consumer_instance(&self) -> &str {
&self.consumer_instance
}
pub fn capability_id(&self) -> &str {
&self.capability_id
}
pub fn descriptor_version(&self) -> &str {
&self.descriptor_version
}
pub fn provider_instance(&self) -> &str {
&self.provider_instance
}
pub const fn provider_order(&self) -> usize {
self.provider_order
}
pub const fn admission(&self) -> RequestAdmissionPlan {
self.admission
}
pub const fn has_explicit_admission(&self) -> bool {
self.admission_explicit
}
pub const fn event_admission(&self) -> EventAdmissionPlan {
self.event_admission
}
pub const fn has_explicit_event_admission(&self) -> bool {
self.event_admission_explicit
}
}