mod atlas;
mod cli;
mod generate;
pub use atlas::{render_atlas_schema, AtlasDatabaseUrl, AtlasSchemaSpec};
pub use cli::{
run, Bus, DescribeArgs, Framework, GitopsPromote, ManifestFormat, ScaffoldArgs, SchemaArgs,
SchemaDialect, SchemaFormat, ServiceArgs, ServiceCommands, Store, Transport,
};
pub use generate::{generate_service_scaffold, package_name};
#[derive(Clone, Debug)]
pub struct ServiceScaffoldSpec {
pub name: String,
pub transport: ServiceTransport,
pub store: StoreTarget,
pub bus: Option<BusTarget>,
pub models: Vec<String>,
pub read_models: bool,
pub commands: Vec<String>,
pub events: Vec<String>,
pub distributed_dependency_path: String,
pub gitops: bool,
pub gitops_promote: Option<GitopsPromoteTarget>,
pub github: Option<GithubRepo>,
pub github_preview: Option<GithubRepo>,
pub github_promote: Option<GithubRepo>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ServiceTransport {
Http,
Knative,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StoreTarget {
Postgres,
Sqlite,
InMemory,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BusTarget {
Rabbitmq,
Kafka,
Psql,
Nats,
}
impl BusTarget {
pub fn kind(self) -> &'static str {
match self {
BusTarget::Rabbitmq => "rabbitmq",
BusTarget::Kafka => "kafka",
BusTarget::Psql => "psql",
BusTarget::Nats => "nats",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GitopsPromoteTarget {
Argo,
Flux,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GithubRepo {
pub owner: String,
pub repo: String,
}
impl GithubRepo {
pub fn parse(raw: &str) -> Result<Self, ScaffoldError> {
generate::parse_github_repo(raw)
}
pub fn slug(&self) -> String {
format!("{}/{}", self.owner, self.repo)
}
}
#[derive(Clone, Debug, Default)]
pub struct GeneratedProject {
pub files: Vec<GeneratedFile>,
pub warnings: Vec<String>,
pub post_create_actions: Vec<PostCreateAction>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GeneratedFile {
pub path: String,
pub contents: String,
pub mode: Option<FileMode>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FileMode {
Executable,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum PostCreateAction {
EnsureGithubRepository {
repo: GithubRepo,
},
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ScaffoldError(pub String);
impl std::fmt::Display for ScaffoldError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
impl std::error::Error for ScaffoldError {}
impl ScaffoldError {
pub(crate) fn new(message: impl Into<String>) -> Self {
Self(message.into())
}
}