update
This commit is contained in:
parent
d2e32d1570
commit
9b99dff857
16
axel/Cargo.toml
Normal file
16
axel/Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "axel"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
versioning = {git = "https://git.ablecorp.us/able/versioning"}
|
||||||
|
hashbrown = "0.12.0"
|
||||||
|
log = "0.4.14"
|
||||||
|
|
||||||
|
[dependencies.logos]
|
||||||
|
version = "0.12.0"
|
||||||
|
default-features = false
|
||||||
|
features = ["export_derive"]
|
80
axel/src/lib.rs
Normal file
80
axel/src/lib.rs
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#![no_std]
|
||||||
|
#![deny(unsafe_code, missing_docs)]
|
||||||
|
//! A simple format for apis
|
||||||
|
|
||||||
|
use {
|
||||||
|
hashbrown::HashMap,
|
||||||
|
logos::Logos,
|
||||||
|
node::{lexer::Token, tree::AxelNode},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub(crate) use alloc::{
|
||||||
|
string::{String, ToString},
|
||||||
|
vec::Vec,
|
||||||
|
};
|
||||||
|
pub use node::signature::FunctionSignature;
|
||||||
|
|
||||||
|
pub extern crate alloc;
|
||||||
|
|
||||||
|
pub mod node;
|
||||||
|
|
||||||
|
/// Parse a string into a vector of nodes
|
||||||
|
pub fn parse(string: String) -> Vec<AxelNode> {
|
||||||
|
let lex = Token::lexer(&string);
|
||||||
|
let mut node_list: Vec<AxelNode> = Vec::new();
|
||||||
|
|
||||||
|
let mut node = AxelNode {
|
||||||
|
name: String::new(),
|
||||||
|
vals: HashMap::new(),
|
||||||
|
functs: Vec::new(),
|
||||||
|
};
|
||||||
|
let mut last_type_key = false;
|
||||||
|
let mut key = String::new();
|
||||||
|
|
||||||
|
for token in lex {
|
||||||
|
use Token::*;
|
||||||
|
match token {
|
||||||
|
Key(data) => {
|
||||||
|
key = data;
|
||||||
|
last_type_key = true;
|
||||||
|
}
|
||||||
|
NodeName(name) => {
|
||||||
|
node.name = name;
|
||||||
|
}
|
||||||
|
Version(version) if last_type_key => {
|
||||||
|
use node::tree::Values::*;
|
||||||
|
node.vals.insert(key.clone(), Version(version));
|
||||||
|
}
|
||||||
|
True => {
|
||||||
|
use node::tree::Values::*;
|
||||||
|
node.vals.insert(key.clone(), Boolean(true));
|
||||||
|
}
|
||||||
|
False => {
|
||||||
|
use node::tree::Values::*;
|
||||||
|
node.vals.insert(key.clone(), Boolean(false));
|
||||||
|
}
|
||||||
|
NodeClose => {
|
||||||
|
node_list.push(node);
|
||||||
|
node = AxelNode {
|
||||||
|
name: String::new(),
|
||||||
|
vals: HashMap::new(),
|
||||||
|
functs: Vec::new(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Number(number) => {
|
||||||
|
if last_type_key {
|
||||||
|
use node::tree::Values::*;
|
||||||
|
node.vals.insert(key.clone(), Number(number));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionSignature(signature) => {
|
||||||
|
node.functs.push((key.clone(), signature));
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node_list
|
||||||
|
}
|
9
axel/src/main.rs
Normal file
9
axel/src/main.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
use axel::parse;
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let p = parse(include_str!("mouse.axel").to_string());
|
||||||
|
|
||||||
|
for node in p {
|
||||||
|
println!("{:?}", node);
|
||||||
|
}
|
||||||
|
}
|
11
axel/src/mouse.axel
Normal file
11
axel/src/mouse.axel
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
mouse{
|
||||||
|
val=
|
||||||
|
x: 1000
|
||||||
|
y: 200
|
||||||
|
buttons: true
|
||||||
|
fn|
|
||||||
|
sub: (Num,Num)->(Num);
|
||||||
|
floatify: (Num,Num)->(Float);
|
||||||
|
able: (None)->(None);
|
||||||
|
foo: (None)->(Num);
|
||||||
|
}
|
92
axel/src/node/lexer.rs
Normal file
92
axel/src/node/lexer.rs
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
//!
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
use super::signature::{signature_handle, FunctionSignature};
|
||||||
|
use alloc::string::ToString;
|
||||||
|
use logos::{Lexer, Logos};
|
||||||
|
use versioning::Version;
|
||||||
|
|
||||||
|
#[derive(Logos, Debug, PartialEq)]
|
||||||
|
///
|
||||||
|
pub enum Token {
|
||||||
|
#[regex("[(][a-zA-Z,]+[)]->[(][a-zA-Z,]+[)]", signature_handle)]
|
||||||
|
///
|
||||||
|
FunctionSignature(FunctionSignature),
|
||||||
|
|
||||||
|
#[token("true")]
|
||||||
|
/// True
|
||||||
|
True,
|
||||||
|
|
||||||
|
#[token("false")]
|
||||||
|
/// False
|
||||||
|
False,
|
||||||
|
|
||||||
|
#[regex("[a-zA-Z]+=")]
|
||||||
|
///
|
||||||
|
Values,
|
||||||
|
|
||||||
|
#[regex("[a-zA-Z]+|")]
|
||||||
|
///
|
||||||
|
Functions,
|
||||||
|
|
||||||
|
#[regex("[a-zA-Z]+[:]", node_handler)]
|
||||||
|
///
|
||||||
|
Key(String),
|
||||||
|
|
||||||
|
#[regex("[a-zA-Z]+[{]", node_handler)]
|
||||||
|
///
|
||||||
|
NodeName(String),
|
||||||
|
|
||||||
|
#[regex("[a-zA-Z]+[(]", node_handler)]
|
||||||
|
///
|
||||||
|
FunctionName(String),
|
||||||
|
|
||||||
|
#[regex("[0-9].[0-9].[0-9]", version_parse)]
|
||||||
|
///
|
||||||
|
Version(Version),
|
||||||
|
|
||||||
|
#[regex("-?[0-9]+", num_handler)]
|
||||||
|
|
||||||
|
///
|
||||||
|
Number(i32),
|
||||||
|
|
||||||
|
#[token("}")]
|
||||||
|
///
|
||||||
|
NodeClose,
|
||||||
|
|
||||||
|
#[error]
|
||||||
|
#[regex(r"[ \t\n\f]+", logos::skip)]
|
||||||
|
///
|
||||||
|
Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn node_handler(lex: &mut Lexer<Token>) -> Option<String> {
|
||||||
|
let slice = lex.slice();
|
||||||
|
let mut node = slice.to_string();
|
||||||
|
node.pop();
|
||||||
|
Some(node)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn version_parse(lex: &mut Lexer<Token>) -> Option<Version> {
|
||||||
|
let slice = lex.slice();
|
||||||
|
let mut version = Version {
|
||||||
|
major: 0,
|
||||||
|
minor: 0,
|
||||||
|
patch: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut parts = slice.split('.');
|
||||||
|
version.major = parts.next().unwrap().parse().unwrap();
|
||||||
|
version.minor = parts.next().unwrap().parse().unwrap();
|
||||||
|
version.patch = parts.next().unwrap().parse().unwrap();
|
||||||
|
|
||||||
|
Some(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn num_handler(lex: &mut Lexer<Token>) -> Option<i32> {
|
||||||
|
let slice = lex.slice();
|
||||||
|
let mut num = slice.to_string();
|
||||||
|
num.pop();
|
||||||
|
Some(num.parse().unwrap())
|
||||||
|
}
|
5
axel/src/node/mod.rs
Normal file
5
axel/src/node/mod.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
//!
|
||||||
|
|
||||||
|
pub mod lexer;
|
||||||
|
pub mod signature;
|
||||||
|
pub mod tree;
|
52
axel/src/node/signature.rs
Normal file
52
axel/src/node/signature.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
//!
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
use logos::Lexer;
|
||||||
|
|
||||||
|
/// A function signature of an axel node
|
||||||
|
pub type FunctionSignature = (Vec<Values>, Vec<Values>);
|
||||||
|
|
||||||
|
use super::{lexer::Token, tree::Values};
|
||||||
|
|
||||||
|
/// Construct a signature handler
|
||||||
|
pub fn signature_handle(lex: &mut Lexer<Token>) -> Option<FunctionSignature> {
|
||||||
|
let slice = lex.slice();
|
||||||
|
let string_sig = slice.to_string();
|
||||||
|
let mut str_pli = string_sig.split("->");
|
||||||
|
let intype = str_pli.next().unwrap().to_string();
|
||||||
|
let outtype = str_pli.next().unwrap().to_string();
|
||||||
|
let ins = typeify(intype);
|
||||||
|
let outs = typeify(outtype);
|
||||||
|
|
||||||
|
Some((ins, outs))
|
||||||
|
}
|
||||||
|
/// Turn a string into a vector of values
|
||||||
|
pub fn typeify(mut types: String) -> Vec<Values> {
|
||||||
|
let mut ret = Vec::new();
|
||||||
|
|
||||||
|
types.remove(0);
|
||||||
|
types.pop();
|
||||||
|
for t in types.split(',') {
|
||||||
|
match t {
|
||||||
|
"Num" => {
|
||||||
|
ret.push(Values::Number(0));
|
||||||
|
}
|
||||||
|
"Float" => {
|
||||||
|
ret.push(Values::Float(0.0));
|
||||||
|
}
|
||||||
|
"String" => {
|
||||||
|
ret.push(Values::String("".to_string()));
|
||||||
|
}
|
||||||
|
"None" => {
|
||||||
|
ret.push(Values::Empty);
|
||||||
|
}
|
||||||
|
"Bool" => {
|
||||||
|
ret.push(Values::Boolean(false));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret
|
||||||
|
}
|
43
axel/src/node/tree.rs
Normal file
43
axel/src/node/tree.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//!
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
///
|
||||||
|
pub enum Values {
|
||||||
|
/// No value
|
||||||
|
Empty,
|
||||||
|
///
|
||||||
|
Version(versioning::Version),
|
||||||
|
|
||||||
|
///
|
||||||
|
Number(i32),
|
||||||
|
///
|
||||||
|
Float(f32),
|
||||||
|
///
|
||||||
|
String(String),
|
||||||
|
///
|
||||||
|
Boolean(bool),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
///
|
||||||
|
pub struct AxelNode {
|
||||||
|
///
|
||||||
|
pub name: String,
|
||||||
|
///
|
||||||
|
pub vals: HashMap<String, Values>,
|
||||||
|
///
|
||||||
|
pub functs: Vec<(String, FunctionSignature)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AxelNode {
|
||||||
|
/// Generate an empty axel node
|
||||||
|
pub fn new(name: String) -> Self {
|
||||||
|
AxelNode {
|
||||||
|
name,
|
||||||
|
vals: HashMap::new(),
|
||||||
|
functs: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
versioning/Cargo.toml
Normal file
11
versioning/Cargo.toml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "versioning"
|
||||||
|
version = "0.1.2"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
[dependencies.serde]
|
||||||
|
version = "1.0"
|
||||||
|
features = ["derive"]
|
13
versioning/src/lib.rs
Normal file
13
versioning/src/lib.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// ! A unified versioning system for Rust.
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
use core::prelude::rust_2021::derive;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
||||||
|
pub struct Version {
|
||||||
|
pub major: u8,
|
||||||
|
pub minor: u8,
|
||||||
|
pub patch: u8,
|
||||||
|
}
|
Loading…
Reference in a new issue