#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum ServerUrl {
#[default]
Prod,
Dev,
Custom(String),
}
impl ServerUrl {
pub const PROD: &'static str = "https://code.aretta.ai";
pub const DEV: &'static str = "https://dev.aretta.ai";
pub fn as_str(&self) -> &str {
match self {
Self::Prod => Self::PROD,
Self::Dev => Self::DEV,
Self::Custom(s) => s,
}
}
pub fn parse(raw: &str) -> Self {
let trimmed = raw.trim();
match trimmed {
"prod" | "production" => Self::Prod,
"dev" | "development" | "staging" => Self::Dev,
"" => Self::Prod,
other if other.starts_with("http://") || other.starts_with("https://") => {
Self::Custom(other.trim_end_matches('/').to_string())
}
other => Self::Custom(format!("https://{}", other.trim_end_matches('/'))),
}
}
pub fn is_well_known(&self) -> bool {
matches!(self, Self::Prod | Self::Dev)
}
}
impl std::fmt::Display for ServerUrl {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[aristo::intent(
"Data-plane base-URL precedence is exactly ARETTA_API_URL (env) > \
aristo.toml [instance] url > the account server, in that order and \
no other. The env override is returned verbatim (preserving the \
prior override behavior and CI/test redirects); the [instance] url \
is normalized via ServerUrl::parse; server.as_str() is the final \
fallback (its default is code.aretta.ai). Reordering these tiers, \
or normalizing or dropping the verbatim env override, would \
silently misroute verify and canon-match requests to the wrong \
Aretta deployment.",
verify = "neural",
id = "data_plane_base_precedence"
)]
pub fn data_plane_base(
env_override: Option<&str>,
instance: Option<&str>,
server: &ServerUrl,
) -> String {
if let Some(v) = env_override {
return v.to_string();
}
if let Some(inst) = instance.map(str::trim).filter(|s| !s.is_empty()) {
return ServerUrl::parse(inst).as_str().to_string();
}
server.as_str().to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prod_resolves_to_code_aretta_ai() {
assert_eq!(ServerUrl::Prod.as_str(), "https://code.aretta.ai");
}
#[test]
fn dev_resolves_to_dev_aretta_ai() {
assert_eq!(ServerUrl::Dev.as_str(), "https://dev.aretta.ai");
}
#[test]
fn parse_prod_aliases() {
assert_eq!(ServerUrl::parse("prod"), ServerUrl::Prod);
assert_eq!(ServerUrl::parse("production"), ServerUrl::Prod);
assert_eq!(ServerUrl::parse(" prod "), ServerUrl::Prod);
}
#[test]
fn parse_dev_aliases() {
assert_eq!(ServerUrl::parse("dev"), ServerUrl::Dev);
assert_eq!(ServerUrl::parse("development"), ServerUrl::Dev);
assert_eq!(ServerUrl::parse("staging"), ServerUrl::Dev);
}
#[test]
fn parse_full_url_passes_through_as_custom() {
let s = ServerUrl::parse("https://aretta.example.com");
assert_eq!(s, ServerUrl::Custom("https://aretta.example.com".into()));
assert_eq!(s.as_str(), "https://aretta.example.com");
}
#[test]
fn parse_http_url_is_accepted_for_self_hosted() {
let s = ServerUrl::parse("http://aretta.internal");
assert_eq!(s, ServerUrl::Custom("http://aretta.internal".into()));
}
#[test]
fn parse_strips_trailing_slash_for_clean_format_strings() {
let s = ServerUrl::parse("https://example.com/");
assert_eq!(s.as_str(), "https://example.com");
}
#[test]
fn parse_bare_host_defaults_to_https() {
let s = ServerUrl::parse("aretta.example.com");
assert_eq!(s, ServerUrl::Custom("https://aretta.example.com".into()));
}
#[test]
fn parse_empty_string_falls_back_to_prod() {
assert_eq!(ServerUrl::parse(""), ServerUrl::Prod);
assert_eq!(ServerUrl::parse(" "), ServerUrl::Prod);
}
#[test]
fn default_is_prod() {
assert_eq!(ServerUrl::default(), ServerUrl::Prod);
}
#[test]
fn is_well_known_matches_prod_and_dev_only() {
assert!(ServerUrl::Prod.is_well_known());
assert!(ServerUrl::Dev.is_well_known());
assert!(!ServerUrl::Custom("https://example.com".into()).is_well_known());
}
#[test]
fn display_renders_full_url() {
assert_eq!(format!("{}", ServerUrl::Prod), "https://code.aretta.ai");
assert_eq!(format!("{}", ServerUrl::Dev), "https://dev.aretta.ai");
assert_eq!(
format!("{}", ServerUrl::Custom("https://x.example.com".into())),
"https://x.example.com"
);
}
#[test]
fn data_plane_base_env_override_wins_verbatim() {
let s = data_plane_base(
Some("https://ci.example.com"),
Some("https://turso.aretta.ai"),
&ServerUrl::Prod,
);
assert_eq!(s, "https://ci.example.com");
}
#[test]
fn data_plane_base_instance_beats_server_and_is_normalized() {
let s = data_plane_base(None, Some("turso.aretta.ai/"), &ServerUrl::Prod);
assert_eq!(s, "https://turso.aretta.ai");
}
#[test]
fn data_plane_base_blank_instance_is_ignored() {
let s = data_plane_base(None, Some(" "), &ServerUrl::Dev);
assert_eq!(s, "https://dev.aretta.ai");
}
#[test]
fn data_plane_base_falls_back_to_server() {
let s = data_plane_base(None, None, &ServerUrl::Prod);
assert_eq!(s, "https://code.aretta.ai");
}
}