use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerElabOptions {
pub namespace_context: String,
pub file_label: String,
pub heartbeat_limit: u64,
pub diagnostic_byte_limit: usize,
}
impl LeanWorkerElabOptions {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn namespace_context(mut self, namespace: &str) -> Self {
namespace.clone_into(&mut self.namespace_context);
self
}
#[must_use]
pub fn file_label(mut self, label: &str) -> Self {
label.clone_into(&mut self.file_label);
self
}
#[must_use]
pub fn heartbeat_limit(mut self, heartbeats: u64) -> Self {
self.heartbeat_limit = heartbeats;
self
}
#[must_use]
pub fn diagnostic_byte_limit(mut self, bytes: usize) -> Self {
self.diagnostic_byte_limit = bytes;
self
}
}
impl Default for LeanWorkerElabOptions {
fn default() -> Self {
Self {
namespace_context: String::new(),
file_label: "<elaborate>".to_owned(),
heartbeat_limit: lean_toolchain::LEAN_HEARTBEAT_LIMIT_DEFAULT,
diagnostic_byte_limit: lean_toolchain::LEAN_DIAGNOSTIC_BYTE_LIMIT_DEFAULT,
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerElabResult {
pub success: bool,
pub diagnostics: Vec<LeanWorkerDiagnostic>,
pub truncated: bool,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerKernelStatus {
Checked,
Rejected,
Unavailable,
Unsupported,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerKernelResult {
pub status: LeanWorkerKernelStatus,
pub diagnostics: Vec<LeanWorkerDiagnostic>,
pub truncated: bool,
pub summary: Option<LeanWorkerKernelSummary>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerKernelSummary {
pub declaration_name: String,
pub kind: String,
pub type_signature: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerDiagnostic {
pub severity: String,
pub message: String,
pub file_label: String,
pub line: Option<u32>,
pub column: Option<u32>,
pub end_line: Option<u32>,
pub end_column: Option<u32>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerElabFailure {
pub diagnostics: Vec<LeanWorkerDiagnostic>,
pub truncated: bool,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerMetaTransparency {
#[default]
Default,
Reducible,
Instances,
All,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerRendered {
pub value: String,
pub rendering: LeanWorkerRendering,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerRendering {
Pretty,
Raw,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerMetaResult<T> {
Ok { value: T },
Failed { failure: LeanWorkerElabFailure },
TimeoutOrHeartbeat { failure: LeanWorkerElabFailure },
Unsupported { failure: LeanWorkerElabFailure },
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerDeclarationFilter {
pub include_private: bool,
pub include_generated: bool,
pub include_internal: bool,
}
impl Default for LeanWorkerDeclarationFilter {
fn default() -> Self {
Self {
include_private: true,
include_generated: false,
include_internal: false,
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerSourceRange {
pub file: String,
pub start_line: u32,
pub start_column: u32,
pub end_line: u32,
pub end_column: u32,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerDeclarationRow {
pub name: String,
pub kind: String,
pub type_signature: Option<String>,
pub source: Option<LeanWorkerSourceRange>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerNameRef {
pub start_line: u32,
pub start_column: u32,
pub end_line: u32,
pub end_column: u32,
pub name: String,
pub is_binder: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "query", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerModuleQuery {
Diagnostics,
TypeAt { line: u32, column: u32 },
GoalAt { line: u32, column: u32 },
References { name: String },
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerModuleSourceSpan {
pub start_line: u32,
pub start_column: u32,
pub end_line: u32,
pub end_column: u32,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerRenderedInfo {
pub value: String,
pub truncated: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerTypeAtResult {
Term {
span: LeanWorkerModuleSourceSpan,
expr: LeanWorkerRenderedInfo,
type_str: LeanWorkerRenderedInfo,
expected_type: Option<LeanWorkerRenderedInfo>,
},
NoTerm,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerGoalAtResult {
Goal {
span: LeanWorkerModuleSourceSpan,
goals_before: Vec<String>,
goals_after: Vec<String>,
truncated: bool,
},
NoTacticContext,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerReferencesResult {
pub references: Vec<LeanWorkerNameRef>,
pub truncated: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "result", content = "body", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerModuleQueryResult {
Diagnostics(LeanWorkerElabFailure),
TypeAt(LeanWorkerTypeAtResult),
GoalAt(LeanWorkerGoalAtResult),
References(LeanWorkerReferencesResult),
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerModuleQueryOutcome {
Ok {
result: LeanWorkerModuleQueryResult,
imports: Vec<String>,
},
MissingImports {
result: LeanWorkerModuleQueryResult,
imports: Vec<String>,
missing: Vec<String>,
},
HeaderParseFailed { diagnostics: LeanWorkerElabFailure },
Unsupported,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerCapabilityMetadata {
pub commands: Vec<LeanWorkerCommandMetadata>,
pub capabilities: Vec<LeanWorkerCapabilityFact>,
pub lean_version: Option<String>,
pub extra: Option<Value>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerCommandMetadata {
pub name: String,
pub version: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerCapabilityFact {
pub name: String,
pub version: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerDoctorReport {
pub diagnostics: Vec<LeanWorkerDoctorDiagnostic>,
pub metadata: Option<Value>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct LeanWorkerDoctorDiagnostic {
pub severity: LeanWorkerDoctorSeverity,
pub code: String,
pub message: String,
pub details: Option<Value>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum LeanWorkerDoctorSeverity {
Pass,
Warning,
Error,
}