Added some basic parsing ability, need to add the network calls

This commit is contained in:
2026-04-06 03:21:28 +01:00
parent 0fc9a31de9
commit c87949bc4b
11 changed files with 155 additions and 1 deletions
+1
View File
@@ -0,0 +1 @@
,deadvey,linux-pc,05.04.2026 21:48,file:///home/deadvey/.config/libreoffice/4;
Generated
+7
View File
@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "happening-server"
version = "0.1.0"
BIN
View File
Binary file not shown.
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
pub struct Character
{
name: String,
}
impl Character
{
pub fn new(new_name: String) -> Character
{
Character
{
name: new_name,
}
}
}
+4
View File
@@ -0,0 +1,4 @@
Indentation style: Allman
Indentation characters: Tabs
Maximum indents: 8
Maximum lines per file: 200
+17 -1
View File
@@ -1,3 +1,19 @@
use std::fs;
use std::collections::HashMap;
mod parsing;
mod character;
fn main() {
println!("Hello, world!");
let mut characters = HashMap::<String, character::Character>::new();
let file_contents: String = fs::read_to_string("stories/story.ha").unwrap();
// Split the file contents into tokens
let tokens: Vec<&str> = file_contents
.split_whitespace()
.collect();
// Run the parsing process
match parsing::token_parse(&tokens, &mut characters) {
Ok(()) => println!("Program exited successfully"),
Err(error) => println!("{}", error),
}
}
+85
View File
@@ -0,0 +1,85 @@
use std::collections::HashMap;
use crate::character;
mod strings;
// Parse the tokens in a file
// Returns success or an error string
pub fn token_parse(
tokens: &Vec<&str>,
mut characters: &mut HashMap::<String, character::Character>
) -> ( Result<(),&'static str> )
{
let mut index: usize = 0;
// Run an infinite loop
loop
{
match tokens.get(index) {
Some(token) => {
// The instructions are related to characters
if token.chars().next().unwrap() == '@'
{
let character_name: String = token.chars().skip(1).collect();
// If the character doesn't exist, then create it
if ! characters.contains_key(&character_name)
{
let new_character = character::Character::new(character_name.clone());
characters.insert(character_name.clone(),new_character);
}
println!("Doing something with a character: {}", character_name);
// The index is incremented to after the character's instructions
index += match character_parse(index+1, &tokens, character_name, &mut characters)
{
Ok(increment) => increment,
Err(error) => return Err(error),
}
}
// Miscelleneous instructions
if token.to_lowercase() == "end"
{
return Ok(());
}
index += 1;
},
None => return Err("File reached termination point")
}
}
}
// Parsing character related instructions
fn character_parse(index: usize, tokens: &Vec<&str>, character_name: String, characters: &mut HashMap::<String, character::Character>) ->
( Result<usize,&'static str> )
{
let mut sum_index: usize = index;
loop
{
match tokens.get(sum_index)
{
Some(token) => {
match token.to_lowercase().as_str()
{
// The character is saying something, so grab the text and pass it
// to the client
"says" =>
{
match strings::extract_quoted(&tokens[sum_index+1..])
{
Some(output_string) =>
{
println!("{}", output_string);
return Ok(sum_index - index);
},
None => return Err("Unable to read string"),
}
},
// Catch all condition, if the instruction is unrecognised as a
// character command
&_ => return Err("Invalid command"),
}
},
None => return Err("File reached termination point")
}
sum_index += 1;
}
}
Binary file not shown.
+25
View File
@@ -0,0 +1,25 @@
pub fn extract_quoted(parts: &[&str]) -> Option<String> {
let mut vec_string = Vec::new();
for part in parts
{
println!("{}",part);
if part.chars().next_back().unwrap() == '"'
{
vec_string.push(*part);
let final_string: String = vec_string.join(" ");
let final_string: String = final_string
.chars()
.skip(1)
.take(
final_string.chars()
.count() - 2)
.collect();
return Some(final_string);
}
else
{
vec_string.push(*part);
}
}
None
}
+2
View File
@@ -0,0 +1,2 @@
@tim says "this text is outputted"
END