use std::fmt::Write as _;
use std::path::{Path, PathBuf};
use ts_rs::{Config, TS};
const OUTPUT: &str = "frontend/client/src/generated.ts";
const HEADER: &str = "\
// Generated from the Rust contracts by `cargo xtask generate`. Do not edit.
//
// Every type here crosses the IPC boundary. Changing one in Rust and forgetting this
// file is what `cargo xtask generate --check` exists to catch.
";
pub(crate) fn output_path(root: &Path) -> PathBuf {
root.join(OUTPUT)
}
pub(crate) fn render() -> Result<String, String> {
let config = Config::default().with_large_int("number");
let mut declarations: Vec<(String, String)> = Vec::new();
macro_rules! export {
($($type:ty),* $(,)?) => {
$(
declarations.push((
<$type as TS>::ident(&config),
<$type as TS>::decl(&config),
));
)*
};
}
export![
origin_domain::AccountId,
origin_domain::AlertId,
origin_domain::ConnectorId,
origin_domain::JobId,
origin_domain::SyncId,
origin_domain::ErrorKind,
origin_domain::ErrorContract,
origin_domain::Health,
origin_domain::Severity,
origin_domain::AlertState,
origin_domain::Alert,
origin_domain::MetricKey,
origin_domain::Unit,
origin_domain::Metric,
origin_domain::Trend,
origin_domain::AccountStatus,
origin_domain::Account,
origin_domain::JobStatus,
origin_domain::Progress,
origin_domain::Job,
origin_domain::SyncOutcome,
origin_domain::SyncState,
origin_domain::ProductPermission,
origin_domain::PlatformPermission,
origin_connector::AuthKind,
origin_connector::ConnectorDescriptor,
origin_connector::AccountIdentity,
origin_sync::SyncTarget,
origin_sync::SyncStatus,
origin_app::AppInfo,
origin_events::SyncCompleted,
origin_events::SyncFailed,
origin_events::AlertRaised,
origin_events::AlertResolved,
origin_events::AccountExpired,
origin_events::JobStarted,
origin_events::JobProgress,
origin_events::JobFinished,
origin_events::PlatformEvent,
];
declarations.sort_by(|left, right| left.0.cmp(&right.0));
declarations.dedup_by(|left, right| left.0 == right.0);
let mut rendered = String::from(HEADER);
for (_, declaration) in &declarations {
let _ = write!(rendered, "\nexport {declaration}\n");
}
Ok(rendered)
}