mirror of
https://github.com/MeexReay/sustlang.git
synced 2025-06-24 02:23:00 +03:00
more commands git add *git add *
This commit is contained in:
parent
39d090baa4
commit
3eb6088f6d
84
Cargo.lock
generated
84
Cargo.lock
generated
@ -2,6 +2,90 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
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]]
|
[[package]]
|
||||||
name = "sustlang"
|
name = "sustlang"
|
||||||
version = "1.0.0"
|
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"
|
||||||
|
@ -5,3 +5,5 @@ edition = "2021"
|
|||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
rand = "0.8.5"
|
||||||
|
bytebuffer = "2.2.0"
|
||||||
|
@ -217,3 +217,4 @@ FUNC_END
|
|||||||
| `NEW_THREAD` | `func` | Вызвать функцию `func` в новом потоке (КОМАНДА В РАЗРАБОТКЕ) |
|
| `NEW_THREAD` | `func` | Вызвать функцию `func` в новом потоке (КОМАНДА В РАЗРАБОТКЕ) |
|
||||||
| `IMPORT` | `script_path` | Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная) (КОМАНДА В РАЗРАБОТКЕ) |
|
| `IMPORT` | `script_path` | Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная) (КОМАНДА В РАЗРАБОТКЕ) |
|
||||||
| `IMPORT_TEXT` | `script_text_var` | Импортировать код из текста переменной в скрипт (КОМАНДА В РАЗРАБОТКЕ) |
|
| `IMPORT_TEXT` | `script_text_var` | Импортировать код из текста переменной в скрипт (КОМАНДА В РАЗРАБОТКЕ) |
|
||||||
|
| `RANDOM` | `min_var`, `max_var`, `result_var` | Получить рандомное число от `min_var` до `max_var` включительно и записать в `result_var` |
|
||||||
|
@ -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::command::CommandType;
|
||||||
use super::super::script::{RunningScript, ScriptError};
|
use super::super::script::{RunningScript, ScriptError};
|
||||||
@ -6,8 +9,8 @@ use super::super::var::{VarType, Variable};
|
|||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::thread;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use std::{fs, thread};
|
||||||
|
|
||||||
#[derive(PartialEq, Clone, Debug)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub struct Command {
|
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 => {
|
CommandType::Import => {
|
||||||
let script_path_var = self.args[0].clone();
|
let script_path_var = self.args[0].clone();
|
||||||
|
|
||||||
@ -1587,13 +1625,58 @@ impl Command {
|
|||||||
let path_var = self.args[0].clone();
|
let path_var = self.args[0].clone();
|
||||||
let stream_var = self.args[1].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 => {
|
CommandType::OpenFileOut => {
|
||||||
let path_var = self.args[0].clone();
|
let path_var = self.args[0].clone();
|
||||||
let stream_var = self.args[1].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 => {
|
CommandType::OpenTcpConnection => {
|
||||||
let addr_var = self.args[0].clone();
|
let addr_var = self.args[0].clone();
|
||||||
|
@ -359,6 +359,12 @@ pub enum CommandType {
|
|||||||
/// Название: IMPORT_TEXT \
|
/// Название: IMPORT_TEXT \
|
||||||
/// Параметры: `script_text_var`
|
/// Параметры: `script_text_var`
|
||||||
ImportText,
|
ImportText,
|
||||||
|
|
||||||
|
/// Получить рандомное число от `min_var: int` до `max_var: int` включительно и записать в `result_var: int`
|
||||||
|
///
|
||||||
|
/// Название: RANDOM \
|
||||||
|
/// Параметры: `min_var`, `max_var`, `result_var`
|
||||||
|
Random,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CommandType {
|
impl CommandType {
|
||||||
@ -424,6 +430,7 @@ impl CommandType {
|
|||||||
"NONE_OPTIONAL" => Ok(CommandType::NoneOptional),
|
"NONE_OPTIONAL" => Ok(CommandType::NoneOptional),
|
||||||
"IMPORT_TEXT" => Ok(CommandType::ImportText),
|
"IMPORT_TEXT" => Ok(CommandType::ImportText),
|
||||||
"IMPORT" => Ok(CommandType::Import),
|
"IMPORT" => Ok(CommandType::Import),
|
||||||
|
"RANDOM" => Ok(CommandType::Random),
|
||||||
_ => Err(ScriptError::CommandUnknownError),
|
_ => Err(ScriptError::CommandUnknownError),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,34 @@
|
|||||||
|
use std::{fs, io::Write};
|
||||||
|
|
||||||
pub trait Pohuy<T, E> {
|
pub trait Pohuy<T, E> {
|
||||||
fn pohuy(&self) {}
|
fn pohuy(&self) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> Pohuy<T, E> for Result<T, E> {}
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,6 +12,8 @@ pub enum ScriptError {
|
|||||||
StringUTF8Error,
|
StringUTF8Error,
|
||||||
VarInitedError,
|
VarInitedError,
|
||||||
FunctionUnknownError,
|
FunctionUnknownError,
|
||||||
|
FileReadError,
|
||||||
|
FileWriteError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for ScriptError {
|
impl Display for ScriptError {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user