pub mod envtemplate;
pub mod lower;
pub mod model;
mod naming;
mod python;
pub mod target;
mod typescript;
use std::collections::BTreeMap;
use soothfast_spec::dialect::{Info, Operation};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SdkKind {
Python,
TypeScript,
}
impl SdkKind {
pub const ALL: &'static [SdkKind] = &[SdkKind::Python, SdkKind::TypeScript];
pub fn name(self) -> &'static str {
match self {
SdkKind::Python => "python",
SdkKind::TypeScript => "typescript",
}
}
pub fn parse_name(s: &str) -> Option<SdkKind> {
match s {
"python" | "py" => Some(SdkKind::Python),
"typescript" | "ts" => Some(SdkKind::TypeScript),
_ => None,
}
}
pub fn emit(
self,
info: &Info,
ops: &[Operation],
opts: &SdkOptions,
) -> Result<SdkFileSet, String> {
let sdk = lower::lower(ops, opts, self)?;
match self {
SdkKind::Python => python::emit(info, &sdk, opts),
SdkKind::TypeScript => typescript::emit(info, &sdk, opts),
}
}
}
#[derive(Debug, Clone)]
pub struct SdkOptions {
pub package: String,
pub module: String,
pub version: String,
pub base_url: Option<String>,
pub embed: Option<String>,
pub embed_args: Vec<String>,
pub embed_env: BTreeMap<String, String>,
pub embed_env_vars: Vec<envtemplate::EnvVar>,
pub targets: Vec<String>,
pub description: Option<String>,
pub repository: Option<String>,
pub paginated: Vec<String>,
pub cursor_param: String,
pub limit_param: String,
}
impl Default for SdkOptions {
fn default() -> Self {
SdkOptions {
package: String::new(),
module: String::new(),
version: String::new(),
base_url: None,
embed: None,
embed_args: Vec::new(),
embed_env: BTreeMap::new(),
embed_env_vars: Vec::new(),
targets: Vec::new(),
description: None,
repository: None,
paginated: Vec::new(),
cursor_param: "cursor".into(),
limit_param: "limit".into(),
}
}
}
fn base_url_for(info: &Info, opts: &SdkOptions) -> Result<Option<String>, String> {
let base_url = opts
.base_url
.clone()
.or_else(|| info.servers.first().cloned());
if base_url.is_none() && opts.embed.is_none() {
return Err(
"no base URL: set `base_url` in the [[sdk]] entry, `servers` on the \
[[spec]] entry, or `embed` to bundle the server itself"
.into(),
);
}
Ok(base_url)
}
#[derive(Debug, Clone, Default)]
pub struct SdkFileSet {
pub files: BTreeMap<String, String>,
pub notes: Vec<String>,
}