use core::fmt;
use serde::{Deserialize, Serialize};
use crate::String;
pub const PACKAGE: &str = "vize:contracts@0.1.3";
pub const PROTOCOL_VERSION: u32 = 1;
pub const L1_PAGE_SCHEMA: u32 = 1;
pub const L2_PAGE_SCHEMA: u32 = 1;
pub const L1_PAGE_FEATURE: &str = "s1-page@1";
pub const L2_PAGE_FEATURE: &str = "s2-page@1";
pub use self::{
L1_PAGE_FEATURE as S1_PAGE_FEATURE, L1_PAGE_SCHEMA as S1_PAGE_SCHEMA,
L2_PAGE_FEATURE as S2_PAGE_FEATURE, L2_PAGE_SCHEMA as S2_PAGE_SCHEMA,
};
pub const REQUIRED_FEATURES: &[&str] = &[L1_PAGE_FEATURE, L2_PAGE_FEATURE];
pub const LANG_FEATURE_PREFIX: &str = "lang:";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Capability {
pub protocol_version: u32,
pub features: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct Span {
pub start: u32,
pub end: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Page {
pub schema_version: u32,
pub text: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Severity {
Error,
Warning,
Info,
Hint,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Stage {
Source,
Surface,
Semantic,
Lowered,
Emit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum PartKind {
Primary,
Secondary,
Help,
Suggestion,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceBlock {
pub source: String,
pub base: u32,
pub lang: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum GuestError {
Instantiate(String),
Trap(String),
Transport(String),
OutOfFuel { budget: u64 },
MemoryLimit { limit: u64 },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct GuestLimits {
pub fuel_per_call: u64,
pub max_memory_bytes: u64,
}
impl Default for GuestLimits {
fn default() -> Self {
Self {
fuel_per_call: 1_000_000_000,
max_memory_bytes: 128 * 1024 * 1024,
}
}
}
impl fmt::Display for GuestError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Instantiate(message) => write!(f, "guest instantiation failed: {message}"),
Self::Trap(message) => write!(f, "guest trapped: {message}"),
Self::Transport(message) => write!(f, "guest transport failed: {message}"),
Self::OutOfFuel { budget } => {
write!(
f,
"guest stopped: it used up its fuel budget of {budget} per call"
)
}
Self::MemoryLimit { limit } => {
write!(
f,
"guest stopped: it tried to grow its memory past {limit} bytes"
)
}
}
}
}
impl From<crate::Span> for Span {
fn from(span: crate::Span) -> Self {
Self {
start: span.start,
end: span.end,
}
}
}
impl From<Span> for crate::Span {
fn from(span: Span) -> Self {
crate::Span::new(span.start, span.end)
}
}