#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum Stack {
#[default]
React,
Vue,
Svelte,
}
impl Stack {
pub const ALL: [Self; 3] = [Self::React, Self::Vue, Self::Svelte];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::React => "react",
Self::Vue => "vue",
Self::Svelte => "svelte",
}
}
#[must_use]
pub const fn entry(self) -> &'static str {
match self {
Self::React => "resources/js/app.tsx",
Self::Vue | Self::Svelte => "resources/js/app.ts",
}
}
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum Database {
#[default]
Postgres,
Sqlite,
Mysql,
}
impl Database {
pub const ALL: [Self; 3] = [Self::Postgres, Self::Sqlite, Self::Mysql];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Postgres => "postgres",
Self::Sqlite => "sqlite",
Self::Mysql => "mysql",
}
}
#[must_use]
pub const fn feature(self) -> &'static str {
match self {
Self::Postgres => "db-postgres",
Self::Sqlite => "db-sqlite",
Self::Mysql => "db-mysql",
}
}
#[must_use]
pub const fn default_url(self) -> &'static str {
match self {
Self::Postgres => "postgres://postgres:postgres@127.0.0.1:5432/__RUST_NAME__",
Self::Sqlite => "sqlite://storage/__RUST_NAME__.sqlite?mode=rwc",
Self::Mysql => "mysql://__RUST_NAME__:secret@127.0.0.1:3306/__RUST_NAME__",
}
}
}
pub struct TemplateFile {
pub path: &'static str,
pub content: &'static str,
}
#[must_use]
pub fn files(stack: Stack, database: Database) -> Vec<TemplateFile> {
let mut all = shared();
all.extend(match stack {
Stack::React => react(),
Stack::Vue => vue(),
Stack::Svelte => svelte(),
});
all.extend(match database {
Database::Postgres => postgres(),
Database::Sqlite => sqlite(),
Database::Mysql => mysql(),
});
all
}
fn shared() -> Vec<TemplateFile> {
vec![
TemplateFile {
path: ".cargo/config.toml",
content: include_str!("files/shared/.cargo/config.toml"),
},
TemplateFile {
path: ".dockerignore",
content: include_str!("files/shared/.dockerignore"),
},
TemplateFile {
path: ".env",
content: include_str!("files/shared/.env"),
},
TemplateFile {
path: ".env.example",
content: include_str!("files/shared/.env.example"),
},
TemplateFile {
path: ".gitignore",
content: include_str!("files/shared/.gitignore"),
},
TemplateFile {
path: "Cargo.toml",
content: include_str!("files/shared/Cargo.toml.in"),
},
TemplateFile {
path: "Dockerfile",
content: include_str!("files/shared/Dockerfile"),
},
TemplateFile {
path: "app/controllers/home_controller.rs",
content: include_str!("files/shared/app/controllers/home_controller.rs"),
},
TemplateFile {
path: "app/controllers/mod.rs",
content: include_str!("files/shared/app/controllers/mod.rs"),
},
TemplateFile {
path: "app/mod.rs",
content: include_str!("files/shared/app/mod.rs"),
},
TemplateFile {
path: "app/models/mod.rs",
content: include_str!("files/shared/app/models/mod.rs"),
},
TemplateFile {
path: "app/pages/errors.rs",
content: include_str!("files/shared/app/pages/errors.rs"),
},
TemplateFile {
path: "app/pages/home.rs",
content: include_str!("files/shared/app/pages/home.rs"),
},
TemplateFile {
path: "app/pages/mod.rs",
content: include_str!("files/shared/app/pages/mod.rs"),
},
TemplateFile {
path: "app/policies/mod.rs",
content: include_str!("files/shared/app/policies/mod.rs"),
},
TemplateFile {
path: "app/requests/mod.rs",
content: include_str!("files/shared/app/requests/mod.rs"),
},
TemplateFile {
path: "app/resources/mod.rs",
content: include_str!("files/shared/app/resources/mod.rs"),
},
TemplateFile {
path: "app/services/mod.rs",
content: include_str!("files/shared/app/services/mod.rs"),
},
TemplateFile {
path: "bootstrap/app.rs",
content: include_str!("files/shared/bootstrap/app.rs"),
},
TemplateFile {
path: "bootstrap/error_pages.rs",
content: include_str!("files/shared/bootstrap/error_pages.rs"),
},
TemplateFile {
path: "bootstrap/mod.rs",
content: include_str!("files/shared/bootstrap/mod.rs"),
},
TemplateFile {
path: "bootstrap/state.rs",
content: include_str!("files/shared/bootstrap/state.rs"),
},
TemplateFile {
path: "config/mod.rs",
content: include_str!("files/shared/config/mod.rs"),
},
TemplateFile {
path: "database/migrations/mod.rs",
content: include_str!("files/shared/database/migrations/mod.rs"),
},
TemplateFile {
path: "database/mod.rs",
content: include_str!("files/shared/database/mod.rs"),
},
TemplateFile {
path: "database/seeders/mod.rs",
content: include_str!("files/shared/database/seeders/mod.rs"),
},
TemplateFile {
path: "justfile",
content: include_str!("files/shared/justfile"),
},
TemplateFile {
path: "public/.gitkeep",
content: include_str!("files/shared/public/.gitkeep"),
},
TemplateFile {
path: "public/robots.txt",
content: include_str!("files/shared/public/robots.txt"),
},
TemplateFile {
path: "resources/css/app.css",
content: include_str!("files/shared/resources/css/app.css"),
},
TemplateFile {
path: "routes/mod.rs",
content: include_str!("files/shared/routes/mod.rs"),
},
TemplateFile {
path: "src/bin/uag.rs",
content: include_str!("files/shared/src/bin/uag.rs"),
},
TemplateFile {
path: "src/lib.rs",
content: include_str!("files/shared/src/lib.rs"),
},
TemplateFile {
path: "src/main.rs",
content: include_str!("files/shared/src/main.rs"),
},
TemplateFile {
path: "storage/framework/.gitkeep",
content: include_str!("files/shared/storage/framework/.gitkeep"),
},
TemplateFile {
path: "storage/logs/.gitkeep",
content: include_str!("files/shared/storage/logs/.gitkeep"),
},
TemplateFile {
path: "storage/uploads/.gitkeep",
content: include_str!("files/shared/storage/uploads/.gitkeep"),
},
TemplateFile {
path: "tests/smoke.rs",
content: include_str!("files/shared/tests/smoke.rs"),
},
]
}
fn react() -> Vec<TemplateFile> {
vec![
TemplateFile {
path: "package.json",
content: include_str!("files/react/package.json"),
},
TemplateFile {
path: "resources/js/app.tsx",
content: include_str!("files/react/resources/js/app.tsx"),
},
TemplateFile {
path: "resources/js/components/.gitkeep",
content: include_str!("files/react/resources/js/components/.gitkeep"),
},
TemplateFile {
path: "resources/js/layouts/default.tsx",
content: include_str!("files/react/resources/js/layouts/default.tsx"),
},
TemplateFile {
path: "resources/js/pages/errors/404.tsx",
content: include_str!("files/react/resources/js/pages/errors/404.tsx"),
},
TemplateFile {
path: "resources/js/pages/errors/419.tsx",
content: include_str!("files/react/resources/js/pages/errors/419.tsx"),
},
TemplateFile {
path: "resources/js/pages/errors/500.tsx",
content: include_str!("files/react/resources/js/pages/errors/500.tsx"),
},
TemplateFile {
path: "resources/js/pages/home.tsx",
content: include_str!("files/react/resources/js/pages/home.tsx"),
},
TemplateFile {
path: "resources/js/types.ts",
content: include_str!("files/react/resources/js/types.ts"),
},
TemplateFile {
path: "tsconfig.json",
content: include_str!("files/react/tsconfig.json"),
},
TemplateFile {
path: "vite.config.ts",
content: include_str!("files/react/vite.config.ts"),
},
]
}
fn vue() -> Vec<TemplateFile> {
vec![
TemplateFile {
path: "package.json",
content: include_str!("files/vue/package.json"),
},
TemplateFile {
path: "resources/js/app.ts",
content: include_str!("files/vue/resources/js/app.ts"),
},
TemplateFile {
path: "resources/js/components/.gitkeep",
content: include_str!("files/vue/resources/js/components/.gitkeep"),
},
TemplateFile {
path: "resources/js/layouts/Default.vue",
content: include_str!("files/vue/resources/js/layouts/Default.vue"),
},
TemplateFile {
path: "resources/js/pages/errors/404.vue",
content: include_str!("files/vue/resources/js/pages/errors/404.vue"),
},
TemplateFile {
path: "resources/js/pages/errors/419.vue",
content: include_str!("files/vue/resources/js/pages/errors/419.vue"),
},
TemplateFile {
path: "resources/js/pages/errors/500.vue",
content: include_str!("files/vue/resources/js/pages/errors/500.vue"),
},
TemplateFile {
path: "resources/js/pages/home.vue",
content: include_str!("files/vue/resources/js/pages/home.vue"),
},
TemplateFile {
path: "resources/js/types.ts",
content: include_str!("files/vue/resources/js/types.ts"),
},
TemplateFile {
path: "tsconfig.json",
content: include_str!("files/vue/tsconfig.json"),
},
TemplateFile {
path: "vite.config.ts",
content: include_str!("files/vue/vite.config.ts"),
},
]
}
fn svelte() -> Vec<TemplateFile> {
vec![
TemplateFile {
path: "package.json",
content: include_str!("files/svelte/package.json"),
},
TemplateFile {
path: "resources/js/app.ts",
content: include_str!("files/svelte/resources/js/app.ts"),
},
TemplateFile {
path: "resources/js/components/.gitkeep",
content: include_str!("files/svelte/resources/js/components/.gitkeep"),
},
TemplateFile {
path: "resources/js/layouts/Default.svelte",
content: include_str!("files/svelte/resources/js/layouts/Default.svelte"),
},
TemplateFile {
path: "resources/js/pages/errors/404.svelte",
content: include_str!("files/svelte/resources/js/pages/errors/404.svelte"),
},
TemplateFile {
path: "resources/js/pages/errors/419.svelte",
content: include_str!("files/svelte/resources/js/pages/errors/419.svelte"),
},
TemplateFile {
path: "resources/js/pages/errors/500.svelte",
content: include_str!("files/svelte/resources/js/pages/errors/500.svelte"),
},
TemplateFile {
path: "resources/js/pages/home.svelte",
content: include_str!("files/svelte/resources/js/pages/home.svelte"),
},
TemplateFile {
path: "resources/js/types.ts",
content: include_str!("files/svelte/resources/js/types.ts"),
},
TemplateFile {
path: "svelte.config.js",
content: include_str!("files/svelte/svelte.config.js"),
},
TemplateFile {
path: "tsconfig.json",
content: include_str!("files/svelte/tsconfig.json"),
},
TemplateFile {
path: "vite.config.ts",
content: include_str!("files/svelte/vite.config.ts"),
},
]
}
fn postgres() -> Vec<TemplateFile> {
vec![TemplateFile {
path: "docker-compose.yml",
content: include_str!("files/db/postgres/docker-compose.yml"),
}]
}
fn sqlite() -> Vec<TemplateFile> {
vec![TemplateFile {
path: "docker-compose.yml",
content: include_str!("files/db/sqlite/docker-compose.yml"),
}]
}
fn mysql() -> Vec<TemplateFile> {
vec![TemplateFile {
path: "docker-compose.yml",
content: include_str!("files/db/mysql/docker-compose.yml"),
}]
}