teo_generator/client/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
mod generators;
mod ctx;
mod generator;

use std::path::Path;
use std::process::Command;
use teo_result::Result;
use teo_runtime::config::client::{Client, ClientLanguage};
use teo_runtime::namespace::Namespace;
use generators::*;
use crate::client::ctx::Ctx;
use crate::client::generator::Generator;
use crate::utils::file::FileUtil;
use crate::utils::message::green_message;

pub async fn generate(main_namespace: &Namespace, client: &Client) -> Result<()> {
    match client.provider {
        ClientLanguage::TypeScript(_) => {
            let ctx = Ctx::new(client, main_namespace);
            let generator = ts::gen::TSGenerator::new();
            gen(generator, &ctx).await
        }
        ClientLanguage::Swift => {
            let ctx = Ctx::new(client, main_namespace);
            let generator = swift::gen::SwiftGenerator::new();
            gen(generator, &ctx).await
        }
        ClientLanguage::Kotlin => {
            let ctx = Ctx::new(client, main_namespace);
            let generator = kotlin::gen::KotlinGenerator::new();
            gen(generator, &ctx).await
        }
        ClientLanguage::CSharp => {
            let ctx = Ctx::new(client, main_namespace);
            let generator = csharp::gen::CSharpGenerator::new();
            gen(generator, &ctx).await
        }
        ClientLanguage::Dart => {
            let ctx = Ctx::new(client, main_namespace);
            let generator = dart::gen::DartGenerator::new();
            gen(generator, &ctx).await
        }
    }?;
    std::process::exit(0);
}

async fn gen<T: Generator>(client_generator: T, ctx: &Ctx<'_>) -> Result<()> {
    let dest_dir = std::env::current_dir()?.join(&ctx.conf.dest);
    let package = ctx.conf.package;
    let git_commit = ctx.conf.git_commit;
    let mut module_dest = dest_dir.clone();
    let should_git_init = !dest_dir.exists();
    if package {
        let package_generator = FileUtil::new(dest_dir.clone());
        client_generator.generate_package_files(ctx, &package_generator).await?;
        module_dest.push(Path::new(client_generator.module_directory_in_package(ctx.conf).as_str()));
    } else {
        let package_generator = FileUtil::new(dest_dir.clone());
        client_generator.update_parent_package_files(ctx, &package_generator).await?;
    }
    let module_generator = FileUtil::new(module_dest);
    client_generator.generate_module_files(ctx, &module_generator).await?;
    client_generator.generate_main(ctx, &module_generator).await?;
    if git_commit && package {
        std::env::set_current_dir(&dest_dir).unwrap();
        if should_git_init {
            // git init
            Command::new("git")
                .arg("init")
                .output().unwrap();
            green_message("Run", "`git init`".to_string());
        }
        // git add -A
        Command::new("git")
            .arg("add")
            .arg("-A")
            .output().unwrap();
        green_message("Run", "`git add -A`".to_string());
        Command::new("git")
            .arg("commit")
            .arg("-m")
            .arg("generated by teo")
            .output().unwrap();
        // git commit
        green_message("Run", "`git commit -m 'generated by teo'`".to_string());
    }
    Ok(())
}