Move service tier helpers out of data types

This commit is contained in:
Ahmed Ibrahim
2026-05-03 07:24:16 +03:00
parent e9a3e91f3c
commit 7ee21cc692
15 changed files with 109 additions and 94 deletions
+18 -24
View File
@@ -355,47 +355,41 @@ pub const SERVICE_TIER_FLEX: &str = "flex";
#[ts(type = "string")]
pub struct ServiceTier(String);
impl ServiceTier {
pub fn new(id: impl Into<String>) -> Self {
Self(id.into())
}
pub fn priority_service_tier() -> ServiceTier {
ServiceTier::from(SERVICE_TIER_PRIORITY)
}
pub fn as_str(&self) -> &str {
self.0.as_str()
}
pub fn flex_service_tier() -> ServiceTier {
ServiceTier::from(SERVICE_TIER_FLEX)
}
pub fn priority() -> Self {
Self::new(SERVICE_TIER_PRIORITY)
}
pub fn service_tier_id(service_tier: &ServiceTier) -> &str {
service_tier.as_ref()
}
pub fn flex() -> Self {
Self::new(SERVICE_TIER_FLEX)
}
pub fn is_priority_service_tier(service_tier: &ServiceTier) -> bool {
service_tier_id(service_tier) == SERVICE_TIER_PRIORITY
}
pub fn is_priority(&self) -> bool {
self.as_str() == SERVICE_TIER_PRIORITY
}
pub fn is_flex(&self) -> bool {
self.as_str() == SERVICE_TIER_FLEX
}
pub fn is_flex_service_tier(service_tier: &ServiceTier) -> bool {
service_tier_id(service_tier) == SERVICE_TIER_FLEX
}
impl AsRef<str> for ServiceTier {
fn as_ref(&self) -> &str {
self.as_str()
self.0.as_str()
}
}
impl From<&str> for ServiceTier {
fn from(value: &str) -> Self {
Self::new(value)
Self(value.to_string())
}
}
impl From<String> for ServiceTier {
fn from(value: String) -> Self {
Self::new(value)
Self(value)
}
}
@@ -407,7 +401,7 @@ impl From<ServiceTier> for String {
impl std::fmt::Display for ServiceTier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
f.write_str(service_tier_id(self))
}
}
+23 -14
View File
@@ -19,6 +19,7 @@ use crate::config_types::Personality;
use crate::config_types::ReasoningSummary;
use crate::config_types::ServiceTier;
use crate::config_types::Verbosity;
use crate::config_types::priority_service_tier;
const PERSONALITY_PLACEHOLDER: &str = "{{ personality }}";
@@ -469,19 +470,24 @@ impl From<ModelInfo> for ModelPreset {
}
}
pub fn model_supports_service_tier(model: &ModelPreset, service_tier: &ServiceTier) -> bool {
model
.service_tiers
.iter()
.any(|tier| tier.id == *service_tier)
}
pub fn model_service_tier<'a>(
model: &'a ModelPreset,
service_tier: &ServiceTier,
) -> Option<&'a ModelServiceTier> {
model
.service_tiers
.iter()
.find(|tier| tier.id == *service_tier)
}
impl ModelPreset {
pub fn supports_service_tier(&self, service_tier: &ServiceTier) -> bool {
self.service_tiers
.iter()
.any(|tier| tier.id == *service_tier)
}
pub fn service_tier(&self, service_tier: &ServiceTier) -> Option<&ModelServiceTier> {
self.service_tiers
.iter()
.find(|tier| tier.id == *service_tier)
}
/// Filter models based on authentication mode.
///
/// In ChatGPT mode, all models are visible. Otherwise, only API-supported models are shown.
@@ -831,7 +837,7 @@ mod tests {
message: "Try Spark.".to_string(),
}),
service_tiers: vec![ModelServiceTier {
id: ServiceTier::priority(),
id: priority_service_tier(),
name: "Fast".to_string(),
description: "Fast tier".to_string(),
}],
@@ -844,6 +850,9 @@ mod tests {
message: "Try Spark.".to_string(),
})
);
assert!(preset.supports_service_tier(&ServiceTier::priority()));
assert!(model_supports_service_tier(
&preset,
&priority_service_tier()
));
}
}