mirror of
https://github.com/Dummi26/mers.git
synced 2025-04-28 18:16:05 +02:00
add missing file
This commit is contained in:
parent
b5924b5da1
commit
56b457e1b3
180
mers/src/lang/fmtgs.rs
Normal file
180
mers/src/lang/fmtgs.rs
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
use std::fmt::{Display, Formatter};
|
||||||
|
|
||||||
|
use super::global_info::{ColorFormatMode, ColorFormatter, GlobalScriptInfo};
|
||||||
|
|
||||||
|
use colorize::AnsiColor;
|
||||||
|
|
||||||
|
pub enum Color {
|
||||||
|
Keep,
|
||||||
|
Grey,
|
||||||
|
Red,
|
||||||
|
Yellow,
|
||||||
|
Green,
|
||||||
|
Blue,
|
||||||
|
Cyan,
|
||||||
|
Magenta,
|
||||||
|
}
|
||||||
|
impl Color {
|
||||||
|
pub fn colorize(&self, s: String) -> String {
|
||||||
|
match self {
|
||||||
|
Self::Keep => s,
|
||||||
|
Self::Grey => s.grey().to_string(),
|
||||||
|
Self::Red => s.red().to_string(),
|
||||||
|
Self::Yellow => s.yellow().to_string(),
|
||||||
|
Self::Green => s.green().to_string(),
|
||||||
|
Self::Blue => s.blue().to_string(),
|
||||||
|
Self::Cyan => s.cyan().to_string(),
|
||||||
|
Self::Magenta => s.magenta().to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct FormatInfo {
|
||||||
|
pub depth: usize,
|
||||||
|
pub brackets: usize,
|
||||||
|
}
|
||||||
|
impl FormatInfo {
|
||||||
|
fn color<F>(&self, info: Option<&GlobalScriptInfo>, color: F, s: String) -> String
|
||||||
|
where
|
||||||
|
F: Fn(&ColorFormatter) -> &Color,
|
||||||
|
{
|
||||||
|
if let Some(info) = info {
|
||||||
|
let color = color(&info.formatter);
|
||||||
|
match info.formatter.mode {
|
||||||
|
ColorFormatMode::Plain => s,
|
||||||
|
ColorFormatMode::Colorize => color.colorize(s),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn open_bracket(&mut self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
let o = self.color(
|
||||||
|
info,
|
||||||
|
|c| &c.bracket_colors[self.brackets % c.bracket_colors.len()],
|
||||||
|
s,
|
||||||
|
);
|
||||||
|
self.brackets += 1;
|
||||||
|
o
|
||||||
|
}
|
||||||
|
pub fn close_bracket(&mut self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.brackets -= 1;
|
||||||
|
self.color(
|
||||||
|
info,
|
||||||
|
|c| &c.bracket_colors[self.brackets % c.bracket_colors.len()],
|
||||||
|
s,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
pub fn go_deeper(&mut self) {
|
||||||
|
self.depth += 1;
|
||||||
|
}
|
||||||
|
pub fn go_shallower(&mut self) {
|
||||||
|
self.depth -= 1;
|
||||||
|
}
|
||||||
|
pub fn variable_ref_symbol(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
s
|
||||||
|
}
|
||||||
|
pub fn variable(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.variable_color, s)
|
||||||
|
}
|
||||||
|
pub fn if_if(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_if_color, s)
|
||||||
|
}
|
||||||
|
pub fn if_else(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_else_color, s)
|
||||||
|
}
|
||||||
|
pub fn loop_loop(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_loop_color, s)
|
||||||
|
}
|
||||||
|
pub fn loop_for(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_for_color, s)
|
||||||
|
}
|
||||||
|
pub fn kw_switch(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_switch_color, s)
|
||||||
|
}
|
||||||
|
pub fn kw_match(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.keyword_match_color, s)
|
||||||
|
}
|
||||||
|
pub fn fncall(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.function_call_color, s)
|
||||||
|
}
|
||||||
|
pub fn fndef_fn(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.function_def_fn_color, s)
|
||||||
|
}
|
||||||
|
pub fn fndef_name(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.function_def_name_color, s)
|
||||||
|
}
|
||||||
|
pub fn value_string_quotes(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.value_string_quotes_color, s)
|
||||||
|
}
|
||||||
|
pub fn value_string_content(&self, info: Option<&GlobalScriptInfo>, s: String) -> String {
|
||||||
|
self.color(info, |c| &c.value_string_content_color, s)
|
||||||
|
}
|
||||||
|
pub fn line_prefix(&self) -> String {
|
||||||
|
" ".repeat(self.depth)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait FormatGs {
|
||||||
|
fn fmtgs(
|
||||||
|
&self,
|
||||||
|
f: &mut Formatter,
|
||||||
|
info: Option<&GlobalScriptInfo>,
|
||||||
|
form: &mut FormatInfo,
|
||||||
|
file: Option<&crate::parsing::file::File>,
|
||||||
|
) -> std::fmt::Result;
|
||||||
|
fn with_info<'a>(&'a self, info: &'a GlobalScriptInfo) -> FormatWithGs<'a, Self> {
|
||||||
|
FormatWithGs {
|
||||||
|
format: &self,
|
||||||
|
info: Some(info),
|
||||||
|
file: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn with_file<'a>(&'a self, file: &'a crate::parsing::file::File) -> FormatWithGs<'a, Self> {
|
||||||
|
FormatWithGs {
|
||||||
|
format: &self,
|
||||||
|
info: None,
|
||||||
|
file: Some(file),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn with_info_and_file<'a>(
|
||||||
|
&'a self,
|
||||||
|
info: &'a GlobalScriptInfo,
|
||||||
|
file: &'a crate::parsing::file::File,
|
||||||
|
) -> FormatWithGs<'a, Self> {
|
||||||
|
FormatWithGs {
|
||||||
|
format: &self,
|
||||||
|
info: Some(info),
|
||||||
|
file: Some(file),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn with<'a>(
|
||||||
|
&'a self,
|
||||||
|
info: Option<&'a GlobalScriptInfo>,
|
||||||
|
file: Option<&'a crate::parsing::file::File>,
|
||||||
|
) -> FormatWithGs<'a, Self> {
|
||||||
|
FormatWithGs {
|
||||||
|
format: &self,
|
||||||
|
info,
|
||||||
|
file,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub struct FormatWithGs<'a, T: ?Sized>
|
||||||
|
where
|
||||||
|
T: FormatGs,
|
||||||
|
{
|
||||||
|
format: &'a T,
|
||||||
|
info: Option<&'a GlobalScriptInfo>,
|
||||||
|
file: Option<&'a crate::parsing::file::File>,
|
||||||
|
}
|
||||||
|
impl<'a, T> Display for FormatWithGs<'a, T>
|
||||||
|
where
|
||||||
|
T: FormatGs,
|
||||||
|
{
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
self.format
|
||||||
|
.fmtgs(f, self.info, &mut FormatInfo::default(), self.file.clone())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user