RUST STUDY(2)

2ho·2025년 4월 8일

RUST

목록 보기
2/3
post-thumbnail

📝PLAN

RUST의 설치, 사용방법을 저번에 알아보았다.
요번시간에는 더욱 깊이 공부를 해볼 예정이다.
RUST라는 언어에 대해서 아는것이 없는 나는 우선 chatGPT에게 물어봤다.

🙋question


chatgpt가 추천해준 것을 읽던중

괜찮은 실습 프로젝트를 발견하였다.
그래서 요번 시간에는 RUST를 이용하여 CLI TOOL을 만들어볼 것이다.

📖STUDY

우선 간단하게 입력한 단어가 뜨게 하는 코드를 작성해볼 것이다.

프로젝트를 만들고
vim을 통해 main.rs을 수정하자.

use clap::Parser;

#[derive(Parser)]
struct Args{
	#[arg(short, long)]
	message: String,
}
fn main(){
	let args = Args::parse;
	println!("메시지: {}", args().message);
}

코드를 완성하였다. 이제 저장하고 실행을 해보자
우선 실행하기 전에

use clap::Parser;

같은 경우 라이브러리이므로 다운을 받아야한다.

cargo add clap --features derive

명령어를 입력하고 다운을 받자.
그리고 이제 코드가 정상작동 하는지 실행을 한번 해보자.

cargo run -- --message "<내가 입력하고 싶은 단어>"

위 코드를 cmd에 입력하면

메시지: helloworld
정상 작동하는 것을 볼 수 있다.

이제 제대로 된 CLI TOOL을 개발해 보자

😎CLI TOOOOOOL

요번에 만들 것은 타이머 기능이다.

⚙️기능

공부할때 쓸 수 있도록 집중시간과 그 집중시간이 끝나면 쉬는 시간을 주며 반복을 하는 기능이다.

🖥️개발 시작

우선 TOOl을 만들기 위해 폴더를 하나 생성한다.
나는 studytime이라는 폴더를 만들었다.

우선 clap은 필수이므로 clap을 추가한다.

cargo.toml에 가면 clap이 추가가 되어있는지 확인이 가능하다.

다음으로 main.rs를 작성하자

use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};

#[derive(Parser, Debug)]

헤더 부분이다.
다음으로 공부시간과, 휴식시간을 정하는 코드이다. 우선 공부시간은 25분, 휴식시간은 5분으로 지정하였다.

struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    rest: u64,
}

그리고 이제 그 코드를 실행했을때 타이머가 출력되게 해주는 코드를 작성했다.

fn main() {
    let args = Args::parse();

    println!("🔥 공부 시작: {}분", args.focus);
    run_timer(args.focus * 60, "🕖 집중 중...");
    
    println!("💤 쉬는 시간: {}분", args.rest);
    run_timer(args.rest * 60, "😴 쉬는 중...");

    println!("✅ 1라운드 완료!");
}

남은 시간을 보여주는 코드도 작성하였다.

fn run_timer(seconds: u64, label: &str) {
    let _start = Instant::now();

    for remaining in (0..seconds).rev() {
        print!("\r{} 남은 시간: {:02}:{:02}", label, remaining / 60, remaining % 60);
        std::io::Write::flush(&mut std::io::stdout()).unwrap();
        sleep(Duration::from_secs(1));
    }
    println!("\r🔔 시간 종료!");
}

전체 코드이다.

use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};

#[derive(Parser, Debug)]

struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    rest: u64,
}
fn main() {
    let args = Args::parse();

    println!("🔥 공부 시작: {}분", args.focus);
    run_timer(args.focus * 60, "🕖 집중 중...");
    
    println!("💤 쉬는 시간: {}분", args.rest);
    run_timer(args.rest * 60, "😴 쉬는 중...");

    println!("✅ 1라운드 완료!");
}
fn run_timer(seconds: u64, label: &str) {
    let _start = Instant::now();

    for remaining in (0..seconds).rev() {
        print!("\r{} 남은 시간: {:02}:{:02}", label, remaining / 60, remaining % 60);
        std::io::Write::flush(&mut std::io::stdout()).unwrap();
        sleep(Duration::from_secs(1));
    }
    println!("\r🔔 시간 종료!");
}

이제 작동시켜 보자

🏃RUN

cmd창에

cargo run -- --focus <원하는 시간> --rest <원하는 시간>

을 입력하면?
테스트를 위해 시간을 1분으로 설정하였다.

초단위로 시간이 흘러가는 것을 볼 수 있다.

공부시간이 끝나면 쉬는 시간이 출력된다.
그리고 쉬는 시간 타이머가 끝나면

완료 되었다는 말과 함께 끝난다.

코드가 정상작동 하는 것을 확인하였다.
다음으로 추가기능을 넣어보자

➕PLUS

코드를 추가하고 수정하자.
우선 struct Args에 rounds를 추가하고

struct Args{
	#[arg(short, long, default_value_t = 1)]
    rounds: u64,
}

그런데 여기서 문제가 있다.
바로 rest와 rounds의 단축옵션이 중복이 된다는 것이다.
그러므로 코드를 이렇게 수정하였다.

struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    breaktime: u64, // rest --> breaktime

    #[arg(short, long, default_value_t = 1)]
    rounds: u64,
}

그리고 메인 코드도 수정과 추가를 하였다.

fn main() {
    let args = Args::parse();

    for round in 1..=args.rounds { // --> 라운드 반복문
        println!("✔️ 라운드 {}/{}", round, args.rounds); // 몇라운드인지 확인하는 출력하는 코드
        
        println!("🔥 집중 시작: {}분", args.focus);
        run_timer(args.focus * 60, "⏰ 집중 중...");

        if round != args.rounds {
            println!("💤 쉬는 시간: {}분", args.breaktime); // rest -> breaktime
            run_timer(args.breaktime * 60, "😴 쉬는 중..."); // rest -> breaktime
        }

        println!("✅ 라운드 {}/{} 완료!\n", round, args.rounds);
    }

    println!("🎉 모든 라운드를 완료했습니다! 수고하셨어요 👏");
}

이것으로 수정을 끝냈다.
이제 정상작동 하는지 보고 마무리하자

실행 코드는

cargo run -- --focus <시간> --breaktime <시간> --rounds <시간>

이다

라운드를 2로 지정하였고 위와 같이 2라운드후 종료되는 것을 알 수 있다.

🎬END

이것으로 CLI TOOL개발이 완료 되었다.
다음에는 RUST로 새로운 무언가를 만들어보자.

profile
!developer

0개의 댓글