use serde::{Deserialize, Serialize};
pub const DEFAULT_API_VERSION: &str = "v23.0";
pub fn is_valid_api_version(version: &str) -> bool {
if !version.starts_with('v') {
return false;
}
let version_number = &version[1..];
let parts: Vec<&str> = version_number.split('.').collect();
if parts.len() != 2 {
return false;
}
parts[0].parse::<u32>().is_ok() && parts[1].parse::<u32>().is_ok()
}
#[derive(Deserialize, Debug, Serialize)]
pub struct Config {
pub facebook_oath_url: String,
pub client_id: String,
pub redirect_uri: String,
}
impl Config {
pub fn new(client_id: String, redirect_uri: String) -> Self {
Config {
facebook_oath_url: "https://www.facebook.com/v23.0/dialog/oauth?".to_owned(),
client_id,
redirect_uri,
}
}
pub fn new_with_version(client_id: String, redirect_uri: String, api_version: String) -> Self {
if !is_valid_api_version(&api_version) {
panic!(
"Invalid API version format: '{}'. Expected format: 'vXX.X' (e.g., 'v23.0')",
api_version
);
}
let facebook_oath_url = format!("https://www.facebook.com/{}/dialog/oauth?", api_version);
Config {
facebook_oath_url,
client_id,
redirect_uri,
}
}
pub fn facebook_oath_url(&self) -> &str {
&self.facebook_oath_url
}
pub fn client_id(&self) -> &str {
&self.client_id
}
pub fn redirect_uri(&self) -> &str {
&self.redirect_uri
}
pub fn api_version(&self) -> Option<&str> {
self.facebook_oath_url
.split('/')
.find(|s| s.starts_with('v') && s.contains('.'))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_valid_api_version() {
assert!(is_valid_api_version("v23.0"));
assert!(is_valid_api_version("v22.0"));
assert!(is_valid_api_version("v1.0"));
assert!(is_valid_api_version("v100.99"));
assert!(!is_valid_api_version("23.0")); assert!(!is_valid_api_version("v23")); assert!(!is_valid_api_version("v23.")); assert!(!is_valid_api_version("v23.0.1")); assert!(!is_valid_api_version("vAB.C")); }
#[test]
fn test_config_default_version() {
let config = Config::new("test_id".to_string(), "http://test".to_string());
assert_eq!(config.api_version(), Some("v23.0"));
}
#[test]
fn test_config_custom_version() {
let config = Config::new_with_version(
"test_id".to_string(),
"http://test".to_string(),
"v22.0".to_string(),
);
assert_eq!(config.api_version(), Some("v22.0"));
assert!(config.facebook_oath_url().contains("v22.0"));
}
#[test]
#[should_panic(expected = "Invalid API version format")]
fn test_config_invalid_version() {
Config::new_with_version(
"test_id".to_string(),
"http://test".to_string(),
"23.0".to_string(), );
}
}