more commands git add *git add *

This commit is contained in:
MeexReay 2024-07-29 02:41:13 +03:00
parent 39d090baa4
commit 3eb6088f6d
7 changed files with 212 additions and 4 deletions

84
Cargo.lock generated
View File

@ -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"

View File

@ -5,3 +5,5 @@ edition = "2021"
readme = "README.md"
[dependencies]
rand = "0.8.5"
bytebuffer = "2.2.0"

View File

@ -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` |

View File

@ -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();

View File

@ -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),
}
}

View File

@ -1,5 +1,34 @@
use std::{fs, io::Write};
pub trait Pohuy<T, E> {
fn pohuy(&self) {}
}
impl<T, E> Pohuy<T, E> for Result<T, E> {}
pub struct FileOutStream {
bytes: Vec<u8>,
bytes_wrote: Vec<u8>,
file_path: String,
}
impl FileOutStream {
pub fn new(file_path: String, bytes: Vec<u8>) -> FileOutStream {
FileOutStream {
bytes,
file_path,
bytes_wrote: Vec::new(),
}
}
}
impl Write for FileOutStream {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
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)
}
}

View File

@ -12,6 +12,8 @@ pub enum ScriptError {
StringUTF8Error,
VarInitedError,
FunctionUnknownError,
FileReadError,
FileWriteError,
}
impl Display for ScriptError {