From 9347442f8a2b5414c2952f7df1ab5b41225fdbfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=A1?= =?UTF-8?q?=D0=B0=D1=84=D1=80=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Sat, 6 Dec 2025 19:31:00 +0000 Subject: [PATCH] Upload files to "src" --- src/main.rs | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/main.rs diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..3fa4063 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,176 @@ +// src/main.rs +//! Главный модуль сервера Futriix +//! +//! Точка входа в приложение, инициализирует сервер и запускает его. +//! Использует wait-free архитектуру с lock-free структурами данных. +//! +//! Особенности: +//! - Логирование в файл с временными метками и миллисекундами +//! - Парсинг аргументов командной строки +//! - Цветной вывод с поддержкой ANSI кодов +//! - Инициализация и запуск сервера +//! - Обработка ошибок и graceful shutdown + +mod common; +mod server; +mod lua_shell; + +use std::env; +use std::fs::OpenOptions; +use std::io::Write; + +use crate::common::FutriixError; + +/// Функция для логирования в файл +/// Записывает сообщения в файл futriix.log с временными метками +/// Используется для отладки и аудита работы сервера +fn log_to_file(message: &str) { + match OpenOptions::new() + .create(true) + .append(true) + .open("futriix.log") + { + Ok(mut file) => { + // ИСПРАВЛЕНИЕ: Используем системное время с миллисекундами + let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f").to_string(); + let log_message = format!("[{}] {}\n", timestamp, message); + let _ = file.write_all(log_message.as_bytes()); + } + Err(e) => eprintln!("Failed to write to log file: {}", e), + } +} + +/// Структура для хранения аргументов командной строки +/// Содержит параметры конфигурации и флаги отладки +struct Args { + config: String, // Путь к файлу конфигурации + debug: bool, // Флаг режима отладки + http_port: Option, // Порт HTTP сервера (опционально) + https_port: Option,// Порт HTTPS сервера (опционально) + host: Option, // Хост для привязки сервера +} + +/// Парсер аргументов командной строки +/// Поддерживает короткие и длинные формы аргументов +/// Возвращает структуру Args с распарсенными значениями +fn parse_args() -> Args { + let mut args = Args { + config: "config.toml".to_string(), + debug: false, + http_port: None, + https_port: None, + host: None, + }; + + let mut iter = env::args().skip(1); + while let Some(arg) = iter.next() { + match arg.as_str() { + "--config" | "-c" => { + if let Some(value) = iter.next() { + args.config = value; + } + } + "--debug" | "-d" => { + args.debug = true; + } + "--http-port" => { + if let Some(value) = iter.next() { + if let Ok(port) = value.parse() { + args.http_port = Some(port); + } + } + } + "--https-port" => { + if let Some(value) = iter.next() { + if let Ok(port) = value.parse() { + args.https_port = Some(port); + } + } + } + "--host" => { + if let Some(value) = iter.next() { + args.host = Some(value); + } + } + _ => { + if arg.starts_with("--config=") { + args.config = arg.trim_start_matches("--config=").to_string(); + } else if arg.starts_with("-c=") { + args.config = arg.trim_start_matches("-c=").to_string(); + } + } + } + } + + args +} + +/// Функция для вывода текста с ANSI цветом +/// Использует escape-последовательности для цветного форматирования +/// Параметр ansi_color должен содержать ANSI escape code +fn print_colored(text: &str, ansi_color: &str) { + println!("{}{}\x1b[0m", ansi_color, text); +} + +/// Конвертация HEX цвета в ANSI escape code +/// Принимает строку в формате #RRGGBB или RRGGBB +/// Возвращает ANSI escape sequence для установки цвета текста +fn hex_to_ansi(hex_color: &str) -> String { + let hex = hex_color.trim_start_matches('#'); + + if hex.len() == 6 { + if let (Ok(r), Ok(g), Ok(b)) = ( + u8::from_str_radix(&hex[0..2], 16), + u8::from_str_radix(&hex[2..4], 16), + u8::from_str_radix(&hex[4..6], 16), + ) { + return format!("\x1b[38;2;{};{};{}m", r, g, b); + } + } + + // Цвет по умолчанию: белый + "\x1b[38;2;255;255;255m".to_string() +} + +#[tokio::main] +async fn main() -> Result<(), FutriixError> { + // Инициализация логирования в файл + log_to_file("Starting Futriix server"); + + // Вывод приветственного сообщения с цветом #00bfff перед загрузкой конфигурации + let color_code = hex_to_ansi("#00bfff"); + println!(); // Добавляем пустую строку перед фразой + print_colored("Futriix Database Server", &color_code); + print_colored("futriix 3i²(by 26.11.2025)", &color_code); + println!(); // Добавляем пустую строку после фразы + + // Парсим аргументы командной строки + let args = parse_args(); + let config_path = args.config; + + let message = format!("Loading configuration from: {}", config_path); + println!("{}", message); + log_to_file(&message); + + // Создание и запуск сервера + match server::FutriixServer::new(&config_path).await { + Ok(server) => { + log_to_file("Server created successfully"); + if let Err(e) = server.run().await { + let error_message = format!("Server error: {}", e); + eprintln!("{}", error_message); + log_to_file(&error_message); + std::process::exit(1); + } + } + Err(e) => { + let error_message = format!("Failed to create server: {}", e); + eprintln!("{}", error_message); + log_to_file(&error_message); + std::process::exit(1); + } + } + + log_to_file("Futriix server stopped"); + Ok(()) +}