Merge branch 'no_std' into 'master'
no_std support Closes #1 See merge request davidbittner/ansi-parser!5
This commit is contained in:
12
src/enums.rs
12
src/enums.rs
@@ -1,8 +1,10 @@
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
use heapless::{Vec, consts::U5};
|
||||
|
||||
///The following are the implemented ANSI escape sequences. More to be added.
|
||||
#[derive(Debug, PartialEq)]
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
pub enum AnsiSequence {
|
||||
CursorPos(u32, u32),
|
||||
CursorUp(u32),
|
||||
@@ -13,7 +15,7 @@ pub enum AnsiSequence {
|
||||
CursorRestore,
|
||||
EraseDisplay,
|
||||
EraseLine,
|
||||
SetGraphicsMode(Vec<u32>),
|
||||
SetGraphicsMode(Vec<u8, U5>),
|
||||
SetMode(u8),
|
||||
ResetMode(u8),
|
||||
HideCursor,
|
||||
@@ -54,9 +56,9 @@ pub enum AnsiSequence {
|
||||
SetTopAndBottom(u32, u32),
|
||||
}
|
||||
|
||||
use std::fmt::Display;
|
||||
use core::fmt::{Display, Formatter, Result as DisplayResult};
|
||||
impl Display for AnsiSequence {
|
||||
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
fn fmt(&self, formatter: &mut Formatter) -> DisplayResult {
|
||||
write!(formatter, "\u{1b}")?;
|
||||
|
||||
use AnsiSequence::*;
|
||||
@@ -181,7 +183,7 @@ pub enum Output<'a> {
|
||||
}
|
||||
|
||||
impl<'a> Display for Output<'a> {
|
||||
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
fn fmt(&self, formatter: &mut Formatter) -> DisplayResult {
|
||||
use Output::*;
|
||||
match self {
|
||||
TextBlock(txt) => write!(formatter, "{}", txt),
|
||||
|
@@ -1,4 +1,5 @@
|
||||
#![recursion_limit="256"]
|
||||
#![cfg_attr(not(any(feature = "std", test)), no_std)]
|
||||
|
||||
mod enums;
|
||||
mod parsers;
|
||||
@@ -20,3 +21,4 @@ mod traits;
|
||||
|
||||
pub use enums::*;
|
||||
pub use traits::*;
|
||||
pub use parsers::parse_escape;
|
||||
|
@@ -1,9 +1,10 @@
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
use crate::{AnsiSequence, Output};
|
||||
use crate::AnsiSequence;
|
||||
|
||||
use std::convert::TryInto;
|
||||
use core::convert::TryInto;
|
||||
use heapless::Vec;
|
||||
use nom::*;
|
||||
|
||||
macro_rules! tag_parser {
|
||||
@@ -97,7 +98,9 @@ named!(
|
||||
tag!("[") >>
|
||||
val: parse_int >>
|
||||
tag!("m") >>
|
||||
(AnsiSequence::SetGraphicsMode(vec![val]))
|
||||
val: expr_res!(val.try_into()) >>
|
||||
conv: expr_res!(Vec::from_slice(&[val])) >>
|
||||
(AnsiSequence::SetGraphicsMode(conv))
|
||||
)
|
||||
);
|
||||
|
||||
@@ -109,7 +112,13 @@ named!(
|
||||
tag!(";") >>
|
||||
val2: parse_int >>
|
||||
tag!("m") >>
|
||||
(AnsiSequence::SetGraphicsMode(vec![val1, val2]))
|
||||
val1: expr_res!(val1.try_into()) >>
|
||||
val2: expr_res!(val2.try_into()) >>
|
||||
conv: expr_res!(Vec::from_slice(&[
|
||||
val1,
|
||||
val2,
|
||||
])) >>
|
||||
(AnsiSequence::SetGraphicsMode(conv))
|
||||
)
|
||||
);
|
||||
|
||||
@@ -123,7 +132,15 @@ named!(
|
||||
tag!(";") >>
|
||||
val3: parse_int >>
|
||||
tag!("m") >>
|
||||
(AnsiSequence::SetGraphicsMode(vec![val1, val2, val3]))
|
||||
val1: expr_res!(val1.try_into()) >>
|
||||
val2: expr_res!(val2.try_into()) >>
|
||||
val3: expr_res!(val3.try_into()) >>
|
||||
conv: expr_res!(Vec::from_slice(&[
|
||||
val1,
|
||||
val2,
|
||||
val3,
|
||||
])) >>
|
||||
(AnsiSequence::SetGraphicsMode(conv))
|
||||
)
|
||||
);
|
||||
|
||||
@@ -131,11 +148,10 @@ named!(
|
||||
graphics_mode4<&str, AnsiSequence>,
|
||||
do_parse!(
|
||||
tag!("[m") >>
|
||||
(AnsiSequence::SetGraphicsMode(vec![]))
|
||||
(AnsiSequence::SetGraphicsMode(Vec::new()))
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
named!(
|
||||
graphics_mode5<&str, AnsiSequence>,
|
||||
do_parse!(
|
||||
@@ -150,7 +166,19 @@ named!(
|
||||
tag!(";") >>
|
||||
val5: parse_int >>
|
||||
tag!("m") >>
|
||||
(AnsiSequence::SetGraphicsMode(vec![val1, val2, val3, val4, val5]))
|
||||
val1: expr_res!(val1.try_into()) >>
|
||||
val2: expr_res!(val2.try_into()) >>
|
||||
val3: expr_res!(val3.try_into()) >>
|
||||
val4: expr_res!(val4.try_into()) >>
|
||||
val5: expr_res!(val5.try_into()) >>
|
||||
conv: expr_res!(Vec::from_slice(&[
|
||||
val1,
|
||||
val2,
|
||||
val3,
|
||||
val4,
|
||||
val5,
|
||||
])) >>
|
||||
(AnsiSequence::SetGraphicsMode(conv))
|
||||
)
|
||||
);
|
||||
|
||||
@@ -169,7 +197,7 @@ named!(
|
||||
named!(
|
||||
set_mode<&str, AnsiSequence>,
|
||||
do_parse!(
|
||||
tag_s!("[=") >>
|
||||
tag!("[=") >>
|
||||
mode: parse_int >>
|
||||
conv: expr_res!(mode.try_into()) >>
|
||||
tag!("h") >>
|
||||
@@ -180,7 +208,7 @@ named!(
|
||||
named!(
|
||||
reset_mode<&str, AnsiSequence>,
|
||||
do_parse!(
|
||||
tag_s!("[=") >>
|
||||
tag!("[=") >>
|
||||
mode: parse_int >>
|
||||
conv: expr_res!(mode.try_into()) >>
|
||||
tag!("l") >>
|
||||
@@ -296,10 +324,10 @@ named!(
|
||||
);
|
||||
|
||||
named!(
|
||||
pub parse_escape<&str, Output>,
|
||||
pub parse_escape<&str, AnsiSequence>,
|
||||
do_parse!(
|
||||
tag_s!("\u{1b}") >>
|
||||
tag!("\u{1b}") >>
|
||||
seq: combined >>
|
||||
(Output::Escape(seq))
|
||||
(seq)
|
||||
)
|
||||
);
|
||||
|
@@ -1,5 +1,8 @@
|
||||
use super::*;
|
||||
use crate::*;
|
||||
use crate::{
|
||||
enums::{AnsiSequence, Output},
|
||||
parsers::parse_escape,
|
||||
traits::AnsiParser,
|
||||
};
|
||||
|
||||
use std::fmt::Write;
|
||||
|
||||
|
@@ -2,19 +2,20 @@ use crate::enums::{Output};
|
||||
use crate::parsers::parse_escape;
|
||||
|
||||
pub trait AnsiParser {
|
||||
fn ansi_parse<'a>(&'a self) -> AnsiParseIterator<'a>;
|
||||
fn ansi_parse(&self) -> AnsiParseIterator<'_>;
|
||||
}
|
||||
|
||||
impl AnsiParser for str {
|
||||
fn ansi_parse<'a>(&'a self) -> AnsiParseIterator<'a> {
|
||||
fn ansi_parse(&self) -> AnsiParseIterator<'_> {
|
||||
AnsiParseIterator {
|
||||
dat: self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl AnsiParser for String {
|
||||
fn ansi_parse<'a>(&'a self) -> AnsiParseIterator<'a> {
|
||||
fn ansi_parse(&self) -> AnsiParseIterator<'_> {
|
||||
AnsiParseIterator {
|
||||
dat: self
|
||||
}
|
||||
@@ -40,7 +41,7 @@ impl<'a> Iterator for AnsiParseIterator<'a> {
|
||||
|
||||
if let Ok(ret) = res {
|
||||
self.dat = &ret.0;
|
||||
Some(ret.1)
|
||||
Some(Output::Escape(ret.1))
|
||||
}else{
|
||||
let pos = self.dat[(loc+1)..].find('\u{1b}');
|
||||
if let Some(loc) = pos {
|
||||
|
Reference in New Issue
Block a user