use ty_plugin_protocol::{
AttributeClaim, AttributeScope, ClassClaim, MethodClaim, PluginCapabilities, PluginClaims,
PluginManifest, ProtocolVersion, RuntimeSpec, SettingsClaim, StubOverlay, SymbolClaim,
VersionReq,
};
#[derive(Debug, Clone)]
pub struct ManifestBuilder {
manifest: PluginManifest,
}
impl ManifestBuilder {
pub fn new(id: impl Into<String>, name: impl Into<String>, version: impl Into<String>) -> Self {
Self {
manifest: PluginManifest {
id: id.into(),
name: name.into(),
version: version.into(),
protocol_version: ProtocolVersion::CURRENT,
ty_compatibility: VersionReq {
requirement: ">=0.0.0".to_string(),
},
runtime: RuntimeSpec::Mock,
capabilities: PluginCapabilities::default(),
claims: PluginClaims::default(),
config_schema: None,
default_config: None,
stub_overlays: Vec::new(),
},
}
}
#[must_use]
pub fn protocol_version(mut self, version: ProtocolVersion) -> Self {
self.manifest.protocol_version = version;
self
}
#[must_use]
pub fn ty_compatibility(mut self, requirement: impl Into<String>) -> Self {
self.manifest.ty_compatibility = VersionReq {
requirement: requirement.into(),
};
self
}
#[must_use]
pub fn runtime(mut self, runtime: RuntimeSpec) -> Self {
self.manifest.runtime = runtime;
self
}
#[must_use]
pub fn claim_class_transform(mut self, qualified_name: impl Into<String>) -> Self {
self.manifest.capabilities.class_transform = true;
self.manifest
.claims
.classes
.push(ClassClaim::exact(qualified_name));
self
}
#[must_use]
pub fn claim_subclass_transform(mut self, base_qualified_name: impl Into<String>) -> Self {
self.manifest.capabilities.class_transform = true;
self.manifest
.claims
.classes
.push(ClassClaim::subclass_of(base_qualified_name));
self
}
#[must_use]
pub fn claim_class_member(
mut self,
owner_qualified_name: impl Into<String>,
attribute_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.class_member = true;
self.manifest.claims.attributes.push(AttributeClaim::exact(
owner_qualified_name,
attribute_name,
AttributeScope::Class,
));
self
}
#[must_use]
pub fn claim_instance_member(
mut self,
owner_qualified_name: impl Into<String>,
attribute_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.instance_member = true;
self.manifest.claims.attributes.push(AttributeClaim::exact(
owner_qualified_name,
attribute_name,
AttributeScope::Instance,
));
self
}
#[must_use]
pub fn claim_class_contribution_target(
mut self,
owner_base_qualified_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.project_index = true;
self.manifest.capabilities.cross_symbol_contributions = true;
self.manifest
.claims
.attributes
.push(AttributeClaim::contribution_target(
owner_base_qualified_name,
AttributeScope::Class,
));
self
}
#[must_use]
pub fn claim_instance_contribution_target(
mut self,
owner_base_qualified_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.project_index = true;
self.manifest.capabilities.cross_symbol_contributions = true;
self.manifest
.claims
.attributes
.push(AttributeClaim::contribution_target(
owner_base_qualified_name,
AttributeScope::Instance,
));
self
}
#[must_use]
pub fn claim_call_signature(mut self, qualified_name: impl Into<String>) -> Self {
self.manifest.capabilities.call_signature = true;
self.manifest.claims.functions.push(SymbolClaim {
qualified_name: qualified_name.into(),
});
self
}
#[must_use]
pub fn claim_call_return(mut self, qualified_name: impl Into<String>) -> Self {
self.manifest.capabilities.call_return = true;
self.manifest.claims.functions.push(SymbolClaim {
qualified_name: qualified_name.into(),
});
self
}
#[must_use]
pub fn claim_call_signature_method(
mut self,
class_qualified_name: impl Into<String>,
method_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.call_signature = true;
self.manifest
.claims
.methods
.push(MethodClaim::exact(class_qualified_name, method_name));
self
}
#[must_use]
pub fn claim_call_signature_method_on_subclass(
mut self,
base_qualified_name: impl Into<String>,
method_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.call_signature = true;
self.manifest
.claims
.methods
.push(MethodClaim::on_subclass_of(
base_qualified_name,
method_name,
));
self
}
#[must_use]
pub fn claim_call_return_method(
mut self,
class_qualified_name: impl Into<String>,
method_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.call_return = true;
self.manifest
.claims
.methods
.push(MethodClaim::exact(class_qualified_name, method_name));
self
}
#[must_use]
pub fn claim_call_return_method_on_subclass(
mut self,
base_qualified_name: impl Into<String>,
method_name: impl Into<String>,
) -> Self {
self.manifest.capabilities.call_return = true;
self.manifest
.claims
.methods
.push(MethodClaim::on_subclass_of(
base_qualified_name,
method_name,
));
self
}
#[must_use]
pub fn project_index(mut self) -> Self {
self.manifest.capabilities.project_index = true;
self
}
#[must_use]
pub fn settings_module(mut self, module: impl Into<String>) -> Self {
self.manifest.capabilities.settings_data = true;
self.manifest.claims.settings.push(SettingsClaim {
module: module.into(),
});
self
}
#[must_use]
pub fn virtual_types(mut self) -> Self {
self.manifest.capabilities.virtual_types = true;
self
}
#[must_use]
pub fn stub_overlay(mut self, module: impl Into<String>, path: impl Into<String>) -> Self {
self.manifest.capabilities.stub_overlays = true;
self.manifest.stub_overlays.push(StubOverlay {
module: module.into(),
path: path.into(),
sha256: None,
});
self
}
#[must_use]
pub fn config_schema(mut self, schema: serde_json::Value) -> Self {
self.manifest.config_schema = Some(schema);
self
}
#[must_use]
pub fn default_config(mut self, config: serde_json::Value) -> Self {
self.manifest.default_config = Some(config);
self
}
#[must_use]
pub fn build(self) -> PluginManifest {
self.manifest
}
}