started working on new tokeniser
This commit is contained in:
@@ -199,4 +199,4 @@ GOTO label
|
|||||||
| 12 | Failed to open archive | Make sure the story file is a zip archive. |
|
| 12 | Failed to open archive | Make sure the story file is a zip archive. |
|
||||||
| 13 | Unable to setup the characters hashmap. | Make sure the characters.json file exists, is valid JSON and contains valid characters. |
|
| 13 | Unable to setup the characters hashmap. | Make sure the characters.json file exists, is valid JSON and contains valid characters. |
|
||||||
| 14 | Unable to read the main story file. | Make sure the story.ha file exists and is readable. |
|
| 14 | Unable to read the main story file. | Make sure the story.ha file exists and is readable. |
|
||||||
| 15 | | |
|
| 15 | | |
|
||||||
|
|||||||
+17
-6
@@ -33,7 +33,7 @@ pub async fn api_process
|
|||||||
(
|
(
|
||||||
data_to_send: Arc<Mutex<DataToSend>>,
|
data_to_send: Arc<Mutex<DataToSend>>,
|
||||||
characters: Arc<Mutex<HashMap::<String,character::Character>>>,
|
characters: Arc<Mutex<HashMap::<String,character::Character>>>,
|
||||||
tx: Sender<(bool, usize)>,
|
tx: Sender<(bool, usize, String)>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// This data must be passed through to the api route in order to be used
|
// This data must be passed through to the api route in order to be used
|
||||||
@@ -41,6 +41,7 @@ pub async fn api_process
|
|||||||
let characters_filter = warp::any().map(move || Arc::clone(&characters));
|
let characters_filter = warp::any().map(move || Arc::clone(&characters));
|
||||||
let tx_filter = warp::any().map(move || tx.clone());
|
let tx_filter = warp::any().map(move || tx.clone());
|
||||||
let tx_filter2 = tx_filter.clone();
|
let tx_filter2 = tx_filter.clone();
|
||||||
|
let tx_filter3 = tx_filter.clone();
|
||||||
|
|
||||||
info!("Running server");
|
info!("Running server");
|
||||||
|
|
||||||
@@ -50,11 +51,11 @@ pub async fn api_process
|
|||||||
.and(data_filter)
|
.and(data_filter)
|
||||||
.and(tx_filter)
|
.and(tx_filter)
|
||||||
// Perform this code on a GET request
|
// Perform this code on a GET request
|
||||||
.map(|state: Arc<Mutex<DataToSend>>, tx_handle: Sender<(bool,usize)>|
|
.map(|state: Arc<Mutex<DataToSend>>, tx_handle: Sender<(bool,usize,String)>|
|
||||||
{
|
{
|
||||||
debug!("GET: {state:?}");
|
debug!("GET: {state:?}");
|
||||||
let reply = state.as_ref();
|
let reply = state.as_ref();
|
||||||
let _ = tx_handle.send((true,0));
|
let _ = tx_handle.send((true,0,String::new()));
|
||||||
warp::reply::json(&reply) // Send the reply data (data_to_send formatted as JSON)
|
warp::reply::json(&reply) // Send the reply data (data_to_send formatted as JSON)
|
||||||
}).boxed();
|
}).boxed();
|
||||||
let characters = warp::path("character")
|
let characters = warp::path("character")
|
||||||
@@ -89,14 +90,24 @@ pub async fn api_process
|
|||||||
.and(warp::post())
|
.and(warp::post())
|
||||||
.and(warp::body::json())
|
.and(warp::body::json())
|
||||||
.and(tx_filter2)
|
.and(tx_filter2)
|
||||||
.map(|index: usize, tx_handle: Sender<(bool,usize)>| {
|
.map(|index: usize, tx_handle: Sender<(bool,usize,String)>| {
|
||||||
debug!("Choice: {index}");
|
debug!("Choice: {index}");
|
||||||
let _ = tx_handle.send((true,index));
|
let _ = tx_handle.send((true,index,String::new()));
|
||||||
|
let reply = "ack";
|
||||||
|
warp::reply::json(&reply)
|
||||||
|
}).boxed();
|
||||||
|
let input = warp::path("input")
|
||||||
|
.and(warp::post())
|
||||||
|
.and(warp::body::json())
|
||||||
|
.and(tx_filter3)
|
||||||
|
.map(|input: String, tx_handle: Sender<(bool, usize, String)>|
|
||||||
|
{
|
||||||
|
let _ = tx_handle.send((true,0,input));
|
||||||
let reply = "ack";
|
let reply = "ack";
|
||||||
warp::reply::json(&reply)
|
warp::reply::json(&reply)
|
||||||
}).boxed();
|
}).boxed();
|
||||||
|
|
||||||
let routes = main.or(characters).or(choice);
|
let routes = main.or(characters).or(choice).or(input);
|
||||||
// Start the server
|
// Start the server
|
||||||
warp::serve(routes)
|
warp::serve(routes)
|
||||||
.run(([127, 0, 0, 1],config::API_PORT))
|
.run(([127, 0, 0, 1],config::API_PORT))
|
||||||
|
|||||||
+18
-17
@@ -39,25 +39,26 @@ pub struct Clothing
|
|||||||
shoes: String,
|
shoes: String,
|
||||||
}
|
}
|
||||||
impl Character {
|
impl Character {
|
||||||
|
// Big ass ugly function because rust doesn't support referencing struct entries by string
|
||||||
pub fn set_field(&mut self, field: &str, value: &str) -> Result<(), ()> {
|
pub fn set_field(&mut self, field: &str, value: &str) -> Result<(), ()> {
|
||||||
match field {
|
match field {
|
||||||
"name" => self.name = value.to_string(),
|
"name" => self.name = value.to_string(),
|
||||||
"gender" => self.gender = value.to_string(),
|
"gender" => self.gender = value.to_string(),
|
||||||
"eye_color" => self.eye_color = value.to_string(),
|
"eye_color" => self.eye_color = value.to_string(),
|
||||||
"pronoun_subject" => self.pronoun_subject = value.to_string(),
|
"pronoun_subject" => self.pronoun_subject = value.to_string(),
|
||||||
"pronoun_object" => self.pronoun_object = value.to_string(),
|
"pronoun_object" => self.pronoun_object = value.to_string(),
|
||||||
"pronoun_deppos" => self.pronoun_deppos = value.to_string(),
|
"pronoun_deppos" => self.pronoun_deppos = value.to_string(),
|
||||||
"pronoun_indpos" => self.pronoun_indpos = value.to_string(),
|
"pronoun_indpos" => self.pronoun_indpos = value.to_string(),
|
||||||
"pronoun_reflex" => self.pronoun_reflex = value.to_string(),
|
"pronoun_reflex" => self.pronoun_reflex = value.to_string(),
|
||||||
"head_shape" => self.head_shape = value.to_string(),
|
"head_shape" => self.head_shape = value.to_string(),
|
||||||
"hair_style" => self.hair_style = value.to_string(),
|
"hair_style" => self.hair_style = value.to_string(),
|
||||||
"torso_shape" => self.torso_shape = value.to_string(),
|
"torso_shape" => self.torso_shape = value.to_string(),
|
||||||
"arm_shape" => self.arm_shape = value.to_string(),
|
"arm_shape" => self.arm_shape = value.to_string(),
|
||||||
"leg_shape" => self.leg_shape = value.to_string(),
|
"leg_shape" => self.leg_shape = value.to_string(),
|
||||||
"hair_color" => self.hair_color = value.to_string(),
|
"hair_color" => self.hair_color = value.to_string(),
|
||||||
"clothing.top" => self.clothing.top = value.to_string(),
|
"clothing.top" => self.clothing.top = value.to_string(),
|
||||||
"clothing.bottom" => self.clothing.bottom = value.to_string(),
|
"clothing.bottom" => self.clothing.bottom = value.to_string(),
|
||||||
"clothing.shoes" => self.clothing.shoes = value.to_string(),
|
"clothing.shoes" => self.clothing.shoes = value.to_string(),
|
||||||
|
|
||||||
_ => return Err(()),
|
_ => return Err(()),
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -3,6 +3,7 @@ mod character;
|
|||||||
mod config;
|
mod config;
|
||||||
mod api;
|
mod api;
|
||||||
mod traits;
|
mod traits;
|
||||||
|
mod tokenise;
|
||||||
|
|
||||||
use std::
|
use std::
|
||||||
{
|
{
|
||||||
@@ -96,7 +97,6 @@ async fn main()
|
|||||||
api::api_process(data_clone1, characters_clone1, tx_clone).await;
|
api::api_process(data_clone1, characters_clone1, tx_clone).await;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// setup the parsing stuff //
|
// setup the parsing stuff //
|
||||||
// Read the file and split it into tokens
|
// Read the file and split it into tokens
|
||||||
// file read from a zip file /story.ha
|
// file read from a zip file /story.ha
|
||||||
@@ -114,6 +114,7 @@ async fn main()
|
|||||||
exit(14);
|
exit(14);
|
||||||
});
|
});
|
||||||
// Tokenise story file
|
// Tokenise story file
|
||||||
|
/*
|
||||||
let tokens: Vec<&str> = file_contents
|
let tokens: Vec<&str> = file_contents
|
||||||
.split_whitespace()
|
.split_whitespace()
|
||||||
.collect();
|
.collect();
|
||||||
@@ -121,8 +122,13 @@ async fn main()
|
|||||||
{
|
{
|
||||||
warn!("No END statement, story may exit unexpectedly");
|
warn!("No END statement, story may exit unexpectedly");
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
let space_seperated: Vec<&str> = file_contents
|
||||||
|
.split_whitespace()
|
||||||
|
.collect();
|
||||||
|
let (tokens, labels,_) = tokenise::tokenise(&space_seperated, 0).unwrap();
|
||||||
debug!("{tokens:?}");
|
debug!("{tokens:?}");
|
||||||
|
/*
|
||||||
let data_clone2 = Arc::clone(&data_to_send);
|
let data_clone2 = Arc::clone(&data_to_send);
|
||||||
let characters_clone2 = Arc::clone(&characters);
|
let characters_clone2 = Arc::clone(&characters);
|
||||||
// Run the parsing process for the DSL
|
// Run the parsing process for the DSL
|
||||||
@@ -142,4 +148,5 @@ async fn main()
|
|||||||
exit(1);
|
exit(1);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ pub fn token_parse(
|
|||||||
tokens: &Vec<&str>,
|
tokens: &Vec<&str>,
|
||||||
characters: &Arc<Mutex<HashMap::<String, character::Character>>>,
|
characters: &Arc<Mutex<HashMap::<String, character::Character>>>,
|
||||||
data_to_send: &Arc<Mutex<api::DataToSend>>,
|
data_to_send: &Arc<Mutex<api::DataToSend>>,
|
||||||
rx: &Receiver<(bool,usize)>,
|
rx: &Receiver<(bool,usize,String)>,
|
||||||
) -> Result<(),String>
|
) -> Result<(),String>
|
||||||
{
|
{
|
||||||
info!("DSL parsing begun");
|
info!("DSL parsing begun");
|
||||||
@@ -76,13 +76,13 @@ pub fn token_parse(
|
|||||||
Err(error) => return Err(error),
|
Err(error) => return Err(error),
|
||||||
};
|
};
|
||||||
if rx.recv().is_err() { warn!("Error sending choices to client"); }
|
if rx.recv().is_err() { warn!("Error sending choices to client"); }
|
||||||
let (_, choice) = match rx.recv()
|
let (_, choice, _) = match rx.recv()
|
||||||
{
|
{
|
||||||
Ok((_,choice)) => (None::<bool>, choice),
|
Ok((_,choice,_)) => (None::<bool>, choice, None::<String>),
|
||||||
Err(err) =>
|
Err(err) =>
|
||||||
{
|
{
|
||||||
warn!("Error receiving choice from client, defaulting to choice 0 {err}");
|
warn!("Error receiving choice from client, defaulting to choice 0 {err}");
|
||||||
(None::<bool>, 0)
|
(None::<bool>, 0, None::<String>)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
index = jump_points[choice];
|
index = jump_points[choice];
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
use crate::
|
||||||
|
{
|
||||||
|
debug,
|
||||||
|
exit,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Token
|
||||||
|
{
|
||||||
|
Null,
|
||||||
|
String(String),
|
||||||
|
Object(Vec<Token>),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tokenise(space_seperated: &Vec<&str>, mut index: usize)
|
||||||
|
-> Result<(Vec<Token>,Vec<(String,usize)>,usize),String>
|
||||||
|
{
|
||||||
|
let mut tokenised_data: Vec<Token> = Vec::new();
|
||||||
|
let mut labels: Vec<(String,usize)> = Vec::new();
|
||||||
|
while index < space_seperated.len()
|
||||||
|
{
|
||||||
|
let mut item = space_seperated[index].to_string();
|
||||||
|
let mut object: Vec<Token> = Vec::new();
|
||||||
|
debug!("{item}");
|
||||||
|
if item.starts_with("\"")
|
||||||
|
{
|
||||||
|
(index, item) = match tokenise_string(&space_seperated, index)
|
||||||
|
{
|
||||||
|
Some((index,item)) => (index, item),
|
||||||
|
None => exit(1),
|
||||||
|
};
|
||||||
|
tokenised_data.push(Token::String(item));
|
||||||
|
}
|
||||||
|
else if item == "{"
|
||||||
|
{
|
||||||
|
(object, labels, index) = match tokenise(&space_seperated, index+1) // !WARNING! recursive call
|
||||||
|
{
|
||||||
|
Ok((object,labels,index)) => (object,labels,index),
|
||||||
|
Err(err) => return Err(err),
|
||||||
|
};
|
||||||
|
tokenised_data.push(Token::Object(object));
|
||||||
|
}
|
||||||
|
else if item == "}"
|
||||||
|
{
|
||||||
|
return Ok((tokenised_data,labels,index));
|
||||||
|
}
|
||||||
|
else { tokenised_data.push(Token::String(item)); }
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
return Ok((tokenised_data, labels, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tokenise_string(space_seperated: &Vec<&str>, mut index: usize)
|
||||||
|
-> Option<(usize, String)>
|
||||||
|
{
|
||||||
|
let mut string = String::new();
|
||||||
|
let mut chars = space_seperated[index].chars();
|
||||||
|
chars.next();
|
||||||
|
string += chars.as_str();
|
||||||
|
for item in &space_seperated[index+1..]
|
||||||
|
{
|
||||||
|
if item.ends_with("\"")
|
||||||
|
{
|
||||||
|
let mut chars = item.chars();
|
||||||
|
chars.next_back();
|
||||||
|
string += format!(" {}", chars.as_str()).as_str();
|
||||||
|
break
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string += format!(" {}", item).as_str();
|
||||||
|
}
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
return Some((index+1,string))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user