use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TypeRef(pub String);
#[derive(Debug, Clone, PartialEq)]
pub struct TypeInfo {
pub resolved_type: Option<TypeRef>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OwnershipState {
Owned,
Borrowed,
MutBorrowed,
Moved,
Managed,
}
#[derive(Debug, Clone, PartialEq)]
pub struct OwnershipInfo {
pub state: Option<OwnershipState>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EffectRef {
pub name: String,
}
impl EffectRef {
#[must_use]
pub fn new(name: impl Into<String>) -> Self {
Self { name: name.into() }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Capability {
pub name: String,
}
impl Capability {
#[must_use]
pub fn new(name: impl Into<String>) -> Self {
Self { name: name.into() }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BehavioralModifier {
Concurrent,
Managed,
Deterministic,
Inline,
Cold,
Hot,
Deprecated(Option<String>),
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ContextBlock {
pub context_text: Option<String>,
pub markers: Vec<ContextMarker>,
pub capabilities: HashSet<Capability>,
pub performance: Option<PerformanceBudget>,
pub invariants: Vec<String>,
pub security: Option<SecurityInfo>,
pub domains: Vec<String>,
pub modifiers: Vec<BehavioralModifier>,
}
impl ContextBlock {
#[must_use]
pub fn is_empty(&self) -> bool {
self.context_text.is_none()
&& self.markers.is_empty()
&& self.capabilities.is_empty()
&& self.performance.is_none()
&& self.invariants.is_empty()
&& self.security.is_none()
&& self.domains.is_empty()
&& self.modifiers.is_empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContextMarker {
pub tag: String,
pub text: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PerformanceBudget {
pub max_latency: Option<Duration>,
pub max_memory: Option<ByteSize>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Duration {
pub value: f64,
pub unit: TimeUnit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimeUnit {
Ns,
Us,
Ms,
S,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ByteSize {
pub value: f64,
pub unit: SizeUnit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SizeUnit {
B,
Kb,
Mb,
Gb,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SecurityInfo {
pub level: String,
pub pii: bool,
}
pub const SECURITY_LEVELS: &[&str] = &["public", "internal", "confidential", "secret"];
#[must_use]
pub fn security_level_rank(level: &str) -> Option<usize> {
SECURITY_LEVELS.iter().position(|&l| l == level)
}
pub const KNOWN_CAPABILITIES: &[&str] = &[
"Network",
"Storage",
"Crypto",
"GPU",
"Camera",
"Microphone",
"Location",
"Notifications",
"Bluetooth",
"Biometrics",
"Clipboard",
"SystemProcess",
"FFI",
"Environment",
"Clock",
"Random",
];
#[derive(Debug, Clone, PartialEq)]
pub struct TargetInfo {
pub _placeholder: (),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Null,
Bool(bool),
Int(i64),
Float(f64),
String(String),
List(Vec<Value>),
Map(HashMap<String, Value>),
}