Skip to content

Commit

Permalink
merge: pull request #59 from init-rust branch to main
Browse files Browse the repository at this point in the history
feat(ai): Init rust + basic handling of arguments
  • Loading branch information
louonezime authored May 21, 2024
2 parents bb437dd + 79f88b4 commit 2d161e1
Show file tree
Hide file tree
Showing 6 changed files with 226 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ zappy_ai
zappy_gui

*.o

Cargo.lock
target/
coding-style-reports.log
.cache
compile_commands.json
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
## Makefile
##

all: gui server
all: gui server ai

gui:
@make -C gui
Expand All @@ -18,17 +18,17 @@ server:

clean:
@make clean -C gui
# @make clean -C ai
@make clean -C ai
@make clean -C server

fclean:
@make fclean -C gui
# @make fclean -C ai
@make fclean -C ai
@make fclean -C server

tests_run:
@make tests_run -C gui
# @make tests_run -C ai
@make tests_run -C ai
@make tests_run -C server

re: fclean all
Expand Down
8 changes: 8 additions & 0 deletions ai/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "ai"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
30 changes: 30 additions & 0 deletions ai/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
##
## EPITECH PROJECT, 2024
## Zappy
## File description:
## Makefile
##

NAME = ../zappy_ai

BIN = ai

SRC = src/main.rs

all: $(NAME)

$(NAME): $(SRC)
cargo build --release --offline && cp ./target/release/$(BIN) $(NAME)

clean:
cargo clean

fclean: clean
rm -f $(NAME)

tests_run:
cargo test

re: fclean all

.PHONY: all re clean fclean tests_run
158 changes: 158 additions & 0 deletions ai/src/flags.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
//
// EPITECH PROJECT, 2024
// Zappy
// File description:
// flags
//

#![allow(dead_code)]

use std::env::{args_os, ArgsOs};
use std::process;

use std::ffi::OsString;
use std::str::FromStr;

use std::fmt::Display;

static LOCALHOST: &str = "127.0.0.1";

static SUCCESS_CODE: i32 = 0;

#[derive(Debug)]
pub struct Flags {
port: Option<usize>,
name: Option<String>,
machine: String,
}

impl Flags {
fn set_port(&mut self, port: usize) {
self.port = Some(port)
}

fn set_name(&mut self, name: String) {
self.name = Some(name)
}

fn set_machine(&mut self, machine: String) {
self.machine = machine
}

pub fn is_port_none(&self) -> bool {
self.port.is_none()
}

pub fn is_name_none(&self) -> bool {
self.name.is_none()
}
}

impl Default for Flags {
fn default() -> Flags {
Flags {
port: None,
name: None,
machine: String::from(LOCALHOST),
}
}
}

impl Display for Flags {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
f,
"Flags {{\n Machine: {},\n Port: {},\n Name: {}\n}};",
self.machine,
self.port
.map_or_else(|| "None".to_string(), |p| p.to_string()),
self.name.clone().unwrap_or_else(|| "None".to_string())
)
}
}

fn parse_arg<T: FromStr>(arg_type: &str, arg: Option<OsString>) -> Result<T, String> {
arg.ok_or_else(|| format!("Flag `{}` argument is missing.", arg_type))
.and_then(|arg| {
arg.into_string()
.map_err(|_| String::from("Invalid UTF-8 Format."))
})
.and_then(|arg| {
arg.parse::<T>()
.map_err(|_| format!("Failed to parse argument for {}.", arg_type))
})
}

fn get_port_from_args(
arg_type: &str,
args: &mut ArgsOs,
flags_struct: &mut Flags,
) -> Result<(), String> {
let port: usize = parse_arg(arg_type, args.next())?;
flags_struct.set_port(port);
Ok(())
}

fn get_name_from_args(
arg_type: &str,
args: &mut ArgsOs,
flags_struct: &mut Flags,
) -> Result<(), String> {
let name: String = parse_arg(arg_type, args.next())?;
flags_struct.set_name(name);
Ok(())
}

fn get_machine_from_args(
arg_type: &str,
args: &mut ArgsOs,
flags_struct: &mut Flags,
) -> Result<(), String> {
let machine: String = parse_arg(arg_type, args.next())?;
flags_struct.set_machine(machine);
Ok(())
}

fn get_flags() -> Result<Flags, String> {
let mut args = args_os();
let mut flags_struct = Flags::default();
args.next();

while let Some(flag) = args.next() {
match flag
.into_string()
.map_err(|_| String::from("Invalid UTF-8 Format."))?
.as_str()
{
"-help" => {
usage();
process::exit(SUCCESS_CODE);
}
"-p" => get_port_from_args("port", &mut args, &mut flags_struct)?,
"-n" => get_name_from_args("name", &mut args, &mut flags_struct)?,
"-h" => get_machine_from_args("machine", &mut args, &mut flags_struct)?,
any => return Err(format!("Unknown flag: {}.", any)),
};
}
Ok(flags_struct)
}

pub fn check_flags() -> Result<Flags, String> {
let flags = get_flags()?;
if flags.is_port_none() {
return Err(String::from("Port is not set."));
}
if flags.is_name_none() {
return Err(String::from("Name is not set."));
}
Ok(flags)
}

pub fn usage() {
println!(
"USAGE: ./zappy_ai -p port -n name -h machine
-p `port` port number
-n `name` name of the team
-h `machine` name of the machine; localhost by default"
)
}
23 changes: 23 additions & 0 deletions ai/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// EPITECH PROJECT, 2024
// Zappy
// File description:
// main
//

use std::process;

mod flags;

static ERROR_CODE: i32 = 84;

fn main() {
match flags::check_flags() {
Ok(res) => println!("{}", res),
Err(e) => {
println!("Error: {}", e);
flags::usage();
process::exit(ERROR_CODE)
}
}
}

0 comments on commit 2d161e1

Please sign in to comment.