use super::{Channel, CrateType, Edition, Mode};
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CompileRequest<'a> {
pub target: CompileTarget,
#[serde(rename = "assemblyFlavor")]
pub assembly_flavor: Option<AssemblyFlavor>,
#[serde(rename = "demangleAssembly")]
pub demangle_assembly: Option<DemangleAssembly>,
#[serde(rename = "processAssembly")]
pub process_assembly: Option<ProcessAssembly>,
pub channel: Channel,
pub mode: Mode,
pub edition: Edition,
#[serde(rename = "crateType")]
pub crate_type: CrateType,
pub tests: bool,
pub backtrace: bool,
pub code: Cow<'a, str>,
}
impl<'a> CompileRequest<'a> {
#[allow(clippy::too_many_arguments)]
pub fn new(
target: CompileTarget,
assembly_flavor: Option<AssemblyFlavor>,
demangle_assembly: Option<DemangleAssembly>,
process_assembly: Option<ProcessAssembly>,
channel: Channel,
mode: Mode,
edition: Edition,
crate_type: CrateType,
tests: bool,
backtrace: bool,
code: Cow<'a, str>,
) -> Self {
Self {
target,
assembly_flavor,
demangle_assembly,
process_assembly,
channel,
mode,
edition,
crate_type,
tests,
backtrace,
code,
}
}
}
impl<'b> super::Request for CompileRequest<'b> {
fn endpoint<'a>(&self) -> super::Endpoints<'a> {
super::Endpoints::Compile
}
}
impl<'a> Default for CompileRequest<'a> {
fn default() -> Self {
Self {
target: CompileTarget::Assembly,
assembly_flavor: Some(AssemblyFlavor::Att),
demangle_assembly: Some(DemangleAssembly::Demangle),
process_assembly: Some(ProcessAssembly::Filter),
channel: Channel::Stable,
mode: Mode::Debug,
edition: Edition::Edition2024,
crate_type: CrateType::Binary,
tests: false,
backtrace: false,
code: Cow::Borrowed("fn main() { println!(\"Hello, world!\"); }"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CompileResponse<'a> {
pub success: bool,
#[serde(rename = "exitDetail")]
pub exit_detail: Cow<'a, str>,
pub code: Cow<'a, str>,
pub stdout: Cow<'a, str>,
pub stderr: Cow<'a, str>,
}
impl<'a> super::Response for CompileResponse<'a> {}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "poise-bot", derive(poise::ChoiceParameter))]
#[serde(rename_all = "lowercase")]
pub enum AssemblyFlavor {
Att,
Intel,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "poise-bot", derive(poise::ChoiceParameter))]
#[serde(rename_all = "lowercase")]
pub enum DemangleAssembly {
Demangle,
Mangle,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "poise-bot", derive(poise::ChoiceParameter))]
#[serde(rename_all = "lowercase")]
pub enum ProcessAssembly {
Filter,
Raw,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "poise-bot", derive(poise::ChoiceParameter))]
#[serde(rename_all = "lowercase")]
pub enum CompileTarget {
#[serde(rename = "asm")]
Assembly,
Hir,
LlvmIr,
Mir,
Wasm,
}