mod any_state;
mod data;
mod eval;
mod print;
mod read;
use crate::{
cmds::CommandResult,
code::{ModsMap, StaticFile, StaticFiles},
input::InputResult,
linking::{self, LinkingConfiguration},
output::{self, Output},
};
use cmdtree::*;
use colored::*;
use crossbeam_channel::Receiver;
use kserd::Kserd;
use std::{
borrow::Cow,
collections::VecDeque,
fmt, fs, io,
marker::PhantomData,
path::{Path, PathBuf},
};
pub struct Repl<S, Data> {
pub data: ReplData<Data>,
state: S,
more: bool,
data_mrker: PhantomData<Data>,
}
pub struct ReplData<Data> {
pub cmdtree: Commander<CommandResult<Data>>,
pub(crate) mods_map: ModsMap,
pub(crate) current_mod: PathBuf,
pub prompt_colour: Color,
pub out_colour: Color,
compilation_dir: PathBuf,
linking: LinkingConfiguration,
pub editing: Option<EditingIndex>,
pub editing_src: Option<String>,
static_files: StaticFiles,
loadedlibs: VecDeque<Box<libloading::Library>>,
pub loaded_libs_size_limit: usize,
}
#[derive(Debug)]
pub struct Read {
output: Output<output::Read>,
}
#[derive(Debug)]
pub struct Evaluate {
output: Output<output::Write>,
result: InputResult,
}
pub struct Evaluating<D> {
jh: Receiver<EvalResult<D>>,
}
#[derive(Debug)]
pub struct Print {
output: Output<output::Write>,
data: EvalOutput,
}
#[derive(Debug)]
enum EvalOutput {
Data(Kserd<'static>),
Print(Cow<'static, str>),
}
pub struct EvalResult<D> {
pub repl: Repl<Print, D>,
pub signal: Signal,
}
#[derive(Debug, PartialEq)]
pub enum Signal {
None,
Exit,
ReEvaluate(String),
}
pub enum ReadResult<D> {
Read(Repl<Read, D>),
Eval(Repl<Evaluate, D>),
}
#[derive(Copy, Clone, Debug)]
pub struct EditingIndex {
pub editing: Editing,
pub index: usize,
}
#[derive(Copy, Clone, Debug)]
pub enum Editing {
Stmt,
Item,
Crate,
}
fn default_compile_dir() -> PathBuf {
dirs::home_dir().unwrap_or_default().join(".papyrus/")
}
#[test]
fn test_default_compile_dir() {
let dir = default_compile_dir();
println!("{}", dir.display());
assert!(dir.ends_with(".papyrus/"));
if cfg!(windows) {
assert!(dir.starts_with("C:\\Users\\"));
} else if cfg!(target_os = "macos") {
assert!(dir.starts_with("/Users/"));
} else {
assert!(dir.starts_with("/home/"));
}
}