From 3eb6088f6d44d8b3fb995f6995af7eedb9942e18 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 29 Jul 2024 02:41:13 +0300 Subject: [PATCH] more commands git add *git add * --- Cargo.lock | 84 +++++++++++++++++++++++++ Cargo.toml | 2 + README.md | 1 + src/sustlang/command/command.rs | 91 ++++++++++++++++++++++++++-- src/sustlang/command/command_type.rs | 7 +++ src/sustlang/other.rs | 29 +++++++++ src/sustlang/script/error.rs | 2 + 7 files changed, 212 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a866d7..c86d64a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,90 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "bytebuffer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7bfaf7cd08cacd74cdc6b521c37ac39cbc92692e5ab5c21ed5657a749b577c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "sustlang" version = "1.0.0" +dependencies = [ + "bytebuffer", + "rand", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/Cargo.toml b/Cargo.toml index 8835b4b..a89635c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,5 @@ edition = "2021" readme = "README.md" [dependencies] +rand = "0.8.5" +bytebuffer = "2.2.0" diff --git a/README.md b/README.md index 8467585..39533e6 100644 --- a/README.md +++ b/README.md @@ -217,3 +217,4 @@ FUNC_END | `NEW_THREAD` | `func` | Вызвать функцию `func` в новом потоке (КОМАНДА В РАЗРАБОТКЕ) | | `IMPORT` | `script_path` | Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная) (КОМАНДА В РАЗРАБОТКЕ) | | `IMPORT_TEXT` | `script_text_var` | Импортировать код из текста переменной в скрипт (КОМАНДА В РАЗРАБОТКЕ) | +| `RANDOM` | `min_var`, `max_var`, `result_var` | Получить рандомное число от `min_var` до `max_var` включительно и записать в `result_var` | diff --git a/src/sustlang/command/command.rs b/src/sustlang/command/command.rs index b4b4cca..6bc1a6c 100644 --- a/src/sustlang/command/command.rs +++ b/src/sustlang/command/command.rs @@ -1,4 +1,7 @@ -use crate::{variable, Pohuy}; +use bytebuffer::ByteBuffer; +use rand::Rng; + +use crate::{variable, FileOutStream, Pohuy}; use super::super::command::CommandType; use super::super::script::{RunningScript, ScriptError}; @@ -6,8 +9,8 @@ use super::super::var::{VarType, Variable}; use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use std::thread; use std::time::Duration; +use std::{fs, thread}; #[derive(PartialEq, Clone, Debug)] pub struct Command { @@ -1573,6 +1576,41 @@ impl Command { }; }); } + CommandType::Random => { + let min_var = self.args[0].clone(); + let max_var = self.args[1].clone(); + let result_var = self.args[2].clone(); + + let min_var = script + .lock() + .unwrap() + .get_var(min_var.clone(), locals) + .map_err(|f| (f, self.clone()))? + .as_int() + .map_err(|f| (f, self.clone()))?; + + let max_var = script + .lock() + .unwrap() + .get_var(max_var.clone(), locals) + .map_err(|f| (f, self.clone()))? + .as_int() + .map_err(|f| (f, self.clone()))?; + + let result = rand::thread_rng().gen_range(min_var..=max_var); + + script + .lock() + .unwrap() + .set_var( + result_var, + Variable::from_int(Some(result)), + global, + false, + locals, + ) + .map_err(|f| (f, self.clone()))?; + } CommandType::Import => { let script_path_var = self.args[0].clone(); @@ -1587,13 +1625,58 @@ impl Command { let path_var = self.args[0].clone(); let stream_var = self.args[1].clone(); - // TODO: write logic + let path_var = script + .lock() + .unwrap() + .get_var(path_var.clone(), locals) + .map_err(|f| (f, self.clone()))? + .as_str() + .map_err(|f| (f, self.clone()))?; + + let result = + fs::read(path_var).map_err(|_| (ScriptError::FileReadError, self.clone()))?; + + script + .lock() + .unwrap() + .set_var( + stream_var, + Variable::from_in_stream(Some(Arc::new(Mutex::new( + ByteBuffer::from_bytes(&result), + )))), + global, + false, + locals, + ) + .map_err(|f| (f, self.clone()))?; } CommandType::OpenFileOut => { let path_var = self.args[0].clone(); let stream_var = self.args[1].clone(); - // TODO: write logic + let path_var = script + .lock() + .unwrap() + .get_var(path_var.clone(), locals) + .map_err(|f| (f, self.clone()))? + .as_str() + .map_err(|f| (f, self.clone()))?; + + let bytes = fs::read(path_var.clone()) + .map_err(|_| (ScriptError::FileWriteError, self.clone()))?; + let result = FileOutStream::new(path_var, bytes); + + script + .lock() + .unwrap() + .set_var( + stream_var, + Variable::from_out_stream(Some(Arc::new(Mutex::new(result)))), + global, + false, + locals, + ) + .map_err(|f| (f, self.clone()))?; } CommandType::OpenTcpConnection => { let addr_var = self.args[0].clone(); diff --git a/src/sustlang/command/command_type.rs b/src/sustlang/command/command_type.rs index 84f9495..fd9ceea 100644 --- a/src/sustlang/command/command_type.rs +++ b/src/sustlang/command/command_type.rs @@ -359,6 +359,12 @@ pub enum CommandType { /// Название: IMPORT_TEXT \ /// Параметры: `script_text_var` ImportText, + + /// Получить рандомное число от `min_var: int` до `max_var: int` включительно и записать в `result_var: int` + /// + /// Название: RANDOM \ + /// Параметры: `min_var`, `max_var`, `result_var` + Random, } impl CommandType { @@ -424,6 +430,7 @@ impl CommandType { "NONE_OPTIONAL" => Ok(CommandType::NoneOptional), "IMPORT_TEXT" => Ok(CommandType::ImportText), "IMPORT" => Ok(CommandType::Import), + "RANDOM" => Ok(CommandType::Random), _ => Err(ScriptError::CommandUnknownError), } } diff --git a/src/sustlang/other.rs b/src/sustlang/other.rs index e27f974..2631c5a 100644 --- a/src/sustlang/other.rs +++ b/src/sustlang/other.rs @@ -1,5 +1,34 @@ +use std::{fs, io::Write}; + pub trait Pohuy { fn pohuy(&self) {} } impl Pohuy for Result {} + +pub struct FileOutStream { + bytes: Vec, + bytes_wrote: Vec, + file_path: String, +} + +impl FileOutStream { + pub fn new(file_path: String, bytes: Vec) -> FileOutStream { + FileOutStream { + bytes, + file_path, + bytes_wrote: Vec::new(), + } + } +} + +impl Write for FileOutStream { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.bytes_wrote.write(buf) + } + + fn flush(&mut self) -> std::io::Result<()> { + self.bytes.write(&self.bytes_wrote)?; + fs::write(&self.file_path, &self.bytes) + } +} diff --git a/src/sustlang/script/error.rs b/src/sustlang/script/error.rs index a129df6..5ea0e76 100644 --- a/src/sustlang/script/error.rs +++ b/src/sustlang/script/error.rs @@ -12,6 +12,8 @@ pub enum ScriptError { StringUTF8Error, VarInitedError, FunctionUnknownError, + FileReadError, + FileWriteError, } impl Display for ScriptError {