prolangkit 0.1.16

A set of language-agnostic utilities for langdev
Documentation
use std::str::FromStr;

use logos::{Lexer, Logos, Span};

use crate::Loc;

impl From<Span> for Loc {
    fn from(value: Span) -> Self {
        Loc {
            start: value.start.try_into().unwrap(),
            end: value.end.try_into().unwrap(),
        }
    }
}

pub fn location<'src, T: Logos<'src>>(lexer: &mut Lexer<'src, T>) -> Loc {
    lexer.span().into()
}

pub fn string<'src, T: Logos<'src, Source = str>>(
    lexer: &mut Lexer<'src, T>,
) -> (Loc, &'src str) {
    (location(lexer), lexer.slice())
}

pub fn parse<'src, T: Logos<'src, Source = str>, R: FromStr>(lexer: &mut Lexer<'src, T>) -> Option<(Loc, R)> {
    Some((lexer.span().into(), lexer.slice().parse().ok()?))
}