mod accesskit_specs;
mod atomics;
#[cfg(feature = "axum-types")]
mod axum_specs;
#[cfg(feature = "bevy-types")]
mod bevy_specs;
mod bool_contracts;
mod char_contracts;
mod clap_specs;
mod collection_contracts;
mod collections;
#[cfg(feature = "csv-types")]
mod csv_specs;
mod datetime_specs;
mod egui_specs;
#[cfg(feature = "egui-winit-types")]
mod egui_winit_specs;
mod elicit_spec;
mod float_contracts;
mod geo_specs;
#[cfg(feature = "geojson-types")]
mod geojson_specs;
#[cfg(feature = "georaster-types")]
mod georaster_specs;
mod http_specs;
mod integer_contracts;
mod integers;
#[cfg(feature = "leptos-types")]
mod leptos_specs;
mod network_specs;
mod palette_specs;
mod polars_specs;
mod proj_specs;
mod ratatui_specs;
#[cfg(feature = "redb-types")]
mod redb_specs;
mod regex_specs;
mod registry;
#[cfg(feature = "rstar-types")]
mod rstar_specs;
mod scalars;
mod sqlx_specs;
mod std_extras;
mod string_contracts;
mod strings;
#[cfg(feature = "toml-types")]
mod toml_specs;
mod tower_specs;
pub mod type_spec_plugin;
#[cfg(feature = "uom-types")]
mod uom_specs;
mod url_specs;
mod uuid_specs;
mod value_specs;
#[cfg(feature = "wgpu-types")]
mod wgpu_specs;
#[cfg(feature = "winit-types")]
mod winit_specs;
#[cfg(feature = "wkb-types")]
mod wkb_specs;
mod wkt_specs;
pub use collections::{HashMapSpec, HashSetSpec, OptionSpec, ResultSpec, VecSpec};
pub use elicit_spec::ElicitSpec;
pub use integers::i32_as_i8_checked;
pub use registry::{TypeSpecInventoryKey, lookup_type_spec, lookup_type_spec_by_id};
use derive_builder::Builder;
use derive_getters::Getters;
use derive_setters::Setters;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Getters, Setters, Builder)]
#[setters(prefix = "with_")]
pub struct SpecEntry {
label: String,
description: String,
#[builder(default)]
expression: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Getters, Setters, Builder)]
#[setters(prefix = "with_")]
pub struct SpecCategory {
name: String,
#[builder(default)]
entries: Vec<SpecEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq, Getters, Setters, Builder)]
#[setters(prefix = "with_")]
pub struct TypeSpec {
type_name: String,
summary: String,
#[builder(default)]
categories: Vec<SpecCategory>,
}
impl TypeSpec {
pub fn build_select(
type_name: &'static str,
summary: &'static str,
variant_labels: &[&'static str],
) -> Self {
let variant_entries = variant_labels
.iter()
.map(|label| {
SpecEntryBuilder::default()
.label((*label).to_string())
.description((*label).to_string())
.build()
.expect("valid SpecEntry")
})
.collect();
let variants_category = SpecCategoryBuilder::default()
.name("variants".to_string())
.entries(variant_entries)
.build()
.expect("valid SpecCategory");
TypeSpecBuilder::default()
.type_name(type_name.to_string())
.summary(summary.to_string())
.categories(vec![variants_category])
.build()
.expect("valid TypeSpec")
}
}