TEST_zap 0.6.1

A blazingly fast networking solution for Roblox.
Documentation
mod config;
mod output;
mod parser;

#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;

#[cfg(not(target_arch = "wasm32"))]
use codespan_reporting::diagnostic::Diagnostic;
#[cfg(target_arch = "wasm32")]
use codespan_reporting::{
	files::SimpleFile,
	term::{self, termcolor::NoColor},
};

#[cfg(not(target_arch = "wasm32"))]
use std::path::PathBuf;

#[derive(Debug)]
#[cfg(not(target_arch = "wasm32"))]
pub struct Output {
	pub path: PathBuf,
	pub code: String,
	pub defs: Option<String>,
}

#[cfg(target_arch = "wasm32")]
#[derive(Debug, Clone)]
#[wasm_bindgen(getter_with_clone)]
pub struct Output {
	pub code: String,
	pub defs: Option<String>,
}

#[derive(Debug)]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(getter_with_clone), derive(Clone))]
pub struct Code {
	pub server: Output,
	pub client: Output,
}

#[derive(Debug)]
#[cfg(not(target_arch = "wasm32"))]
pub struct Return {
	pub code: Option<Code>,
	pub diagnostics: Vec<Diagnostic<()>>,
}

#[cfg(target_arch = "wasm32")]
#[derive(Debug)]
#[wasm_bindgen(getter_with_clone)]
pub struct Return {
	pub code: Option<Code>,
	pub diagnostics: String,
}

#[cfg(not(target_arch = "wasm32"))]
pub fn run(input: &str) -> Return {
	let (config, reports) = parser::parse(input);

	if let Some(config) = config {
		Return {
			code: Some(Code {
				server: Output {
					path: config.server_output.into(),
					code: output::luau::server::code(&config),
					defs: output::typescript::server::code(&config),
				},
				client: Output {
					path: config.client_output.into(),
					code: output::luau::client::code(&config),
					defs: output::typescript::client::code(&config),
				},
			}),
			diagnostics: reports.into_iter().map(|report| report.into()).collect(),
		}
	} else {
		Return {
			code: None,
			diagnostics: reports.into_iter().map(|report| report.into()).collect(),
		}
	}
}

#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn run(input: &str) -> Return {
	let (config, reports) = parser::parse(input);

	let mut writer = NoColor::new(Vec::new());

	let file = SimpleFile::new("input.zap", input);
	let term_config = term::Config::default();

	for report in reports {
		term::emit(&mut writer, &term_config, &file, &report.into()).unwrap();
	}

	let diagnostics = String::from_utf8(writer.into_inner()).unwrap();

	if let Some(config) = config {
		Return {
			code: Some(Code {
				server: Output {
					code: output::luau::server::code(&config),
					defs: output::typescript::server::code(&config),
				},
				client: Output {
					code: output::luau::client::code(&config),
					defs: output::typescript::client::code(&config),
				},
			}),
			diagnostics,
		}
	} else {
		Return {
			code: None,
			diagnostics,
		}
	}
}