API Reference
Developer reference for SomaFM Player’s internal APIs and data structures.
Note: This page covers the internal Rust API. For the complete generated API documentation with full type information, see the API Documentation section.
Core Modules
soma_player::config
Configuration management for persistent settings.
Config
#![allow(unused)]
fn main() {
pub struct Config {
pub last_channel_id: Option<String>,
pub volume: u8,
pub auto_start: bool,
}
}
Methods:
Config::load() -> Result<Config>- Load configuration from fileConfig::save(&self) -> Result<()>- Save configuration to fileConfig::default_path() -> PathBuf- Get default config file path
Example:
#![allow(unused)]
fn main() {
use soma_player::config::Config;
let mut config = Config::load()?;
config.volume = 75;
config.save()?;
}
soma_player::models
Core data structures and types.
Channel
#![allow(unused)]
fn main() {
pub struct Channel {
pub id: String,
pub title: String,
pub description: String,
pub listeners: u32,
pub genre: String,
}
}
Represents a SomaFM radio channel with metadata.
PlayerState
#![allow(unused)]
fn main() {
pub enum PlayerState {
Stopped,
Playing,
Paused,
Buffering,
Error(String),
}
}
Current state of the audio player.
SomaError
#![allow(unused)]
fn main() {
pub enum SomaError {
Network(reqwest::Error),
Audio(String),
Config(toml::de::Error),
Io(std::io::Error),
Parse(String),
}
}
Comprehensive error types with context information.
soma_player::api
SomaFM API integration and HTTP client.
SomaClient
#![allow(unused)]
fn main() {
pub struct SomaClient {
// Internal HTTP client
}
}
Methods:
SomaClient::new() -> Self- Create new API clientget_channels(&self) -> Result<Vec<Channel>>- Fetch available channelsget_stream_url(&self, channel_id: &str) -> Result<String>- Get stream URL
Example:
#![allow(unused)]
fn main() {
use soma_player::api::SomaClient;
let client = SomaClient::new();
let channels = client.get_channels().await?;
let stream_url = client.get_stream_url("groovesalad").await?;
}
soma_player::audio
Audio playback engine and controls.
AudioPlayer
#![allow(unused)]
fn main() {
pub struct AudioPlayer {
// Audio sink and state
}
}
Methods:
AudioPlayer::new() -> Result<Self>- Create new audio playerplay(&mut self, url: String) -> Result<()>- Start playing streampause(&mut self) -> Result<()>- Pause playbackresume(&mut self) -> Result<()>- Resume playbackset_volume(&mut self, volume: f32) -> Result<()>- Set volume (0.0-1.0)stop(&mut self) -> Result<()>- Stop playback
PlayerCommand
#![allow(unused)]
fn main() {
pub enum PlayerCommand {
Play(String),
Pause,
Resume,
SetVolume(f32),
Stop,
}
}
Commands for controlling audio playback.
Example:
#![allow(unused)]
fn main() {
use soma_player::audio::{AudioPlayer, PlayerCommand};
let mut player = AudioPlayer::new()?;
player.play("http://stream.url".to_string())?;
player.set_volume(0.75)?;
}
soma_player::ui
Terminal user interface components.
App
#![allow(unused)]
fn main() {
pub struct App {
pub state: AppState,
pub channels: Vec<Channel>,
pub selected_channel: Option<usize>,
// ... other fields
}
}
Main application state container.
AppState
#![allow(unused)]
fn main() {
pub enum AppState {
ChannelSelection,
Playing,
ChannelOverlay,
Quitting,
}
}
Current UI state for the application.
Methods:
App::new(channels: Vec<Channel>) -> Self- Create new app instancehandle_input(&mut self, event: KeyEvent) -> Result<()>- Process keyboard inputupdate(&mut self) -> Result<()>- Update application stateshould_quit(&self) -> bool- Check if app should exit
Data Flow APIs
Configuration Flow
#![allow(unused)]
fn main() {
// Load configuration
let config = Config::load().unwrap_or_default();
// Use configuration
if config.auto_start {
// Auto-start last channel
}
// Save changes
config.volume = new_volume;
config.save()?;
}
Channel Management
#![allow(unused)]
fn main() {
// Fetch channels from API
let client = SomaClient::new();
let channels = client.get_channels().await?;
// Select channel
let selected = &channels[index];
let stream_url = client.get_stream_url(&selected.id).await?;
}
Audio Control
#![allow(unused)]
fn main() {
// Initialize player
let mut player = AudioPlayer::new()?;
// Control playback
player.play(stream_url)?;
player.set_volume(0.8)?;
player.pause()?;
player.resume()?;
}
UI Event Handling
#![allow(unused)]
fn main() {
// Create app
let mut app = App::new(channels);
// Main event loop
loop {
if let Ok(event) = event::read() {
app.handle_input(event)?;
app.update()?;
if app.should_quit() {
break;
}
}
}
}
Error Handling
Result Types
All fallible operations return Result<T, SomaError>:
#![allow(unused)]
fn main() {
pub type Result<T> = std::result::Result<T, SomaError>;
}
Error Context
Errors include rich context information:
#![allow(unused)]
fn main() {
use soma_player::Result;
fn example_function() -> Result<()> {
config.load()
.map_err(|e| SomaError::Config(e))?;
Ok(())
}
}
Error Conversion
Automatic conversion from standard error types:
#![allow(unused)]
fn main() {
impl From<std::io::Error> for SomaError {
fn from(err: std::io::Error) -> Self {
SomaError::Io(err)
}
}
}
Async Patterns
API Calls
use tokio;
#[tokio::main]
async fn main() -> Result<()> {
let client = SomaClient::new();
let channels = client.get_channels().await?;
Ok(())
}
Non-blocking Operations
#![allow(unused)]
fn main() {
// Spawn background task for API calls
let handle = tokio::spawn(async move {
client.get_channels().await
});
// Continue with UI work
// ...
// Get result when needed
let channels = handle.await??;
}
Testing APIs
Unit Testing
#![allow(unused)]
fn main() {
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn test_config_save_load() {
let dir = tempdir().unwrap();
let config_path = dir.path().join("config.toml");
let config = Config {
volume: 75,
last_channel_id: Some("groovesalad".to_string()),
auto_start: true,
};
config.save_to_path(&config_path).unwrap();
let loaded = Config::load_from_path(&config_path).unwrap();
assert_eq!(config.volume, loaded.volume);
}
}
}
Mock Objects
#![allow(unused)]
fn main() {
// Mock API client for testing
pub struct MockSomaClient {
channels: Vec<Channel>,
}
impl MockSomaClient {
pub fn new(channels: Vec<Channel>) -> Self {
Self { channels }
}
}
#[async_trait]
impl ApiClient for MockSomaClient {
async fn get_channels(&self) -> Result<Vec<Channel>> {
Ok(self.channels.clone())
}
}
}
Extension Points
Custom Audio Backends
#![allow(unused)]
fn main() {
pub trait AudioBackend {
fn play(&mut self, url: String) -> Result<()>;
fn pause(&mut self) -> Result<()>;
fn set_volume(&mut self, volume: f32) -> Result<()>;
}
// Implement for different audio systems
impl AudioBackend for RodioBackend { /* ... */ }
impl AudioBackend for PulseAudioBackend { /* ... */ }
}
Custom UI Themes
#![allow(unused)]
fn main() {
pub struct Theme {
pub primary_color: Color,
pub secondary_color: Color,
pub background_color: Color,
pub accent_color: Color,
}
impl App {
pub fn set_theme(&mut self, theme: Theme) {
self.theme = theme;
}
}
}
Performance APIs
Caching
#![allow(unused)]
fn main() {
use std::collections::HashMap;
pub struct ChannelCache {
cache: HashMap<String, Vec<Channel>>,
ttl: Duration,
}
impl ChannelCache {
pub fn get_or_fetch(&mut self, key: &str) -> Result<Vec<Channel>> {
// Return cached data or fetch new
}
}
}
Metrics
#![allow(unused)]
fn main() {
pub struct Metrics {
pub api_calls: u64,
pub cache_hits: u64,
pub audio_buffer_underruns: u64,
}
impl App {
pub fn get_metrics(&self) -> Metrics {
// Return current metrics
}
}
}
Constants and Configuration
Default Values
#![allow(unused)]
fn main() {
pub const DEFAULT_VOLUME: u8 = 50;
pub const DEFAULT_CONFIG_DIR: &str = ".config/soma-player";
pub const API_BASE_URL: &str = "https://somafm.com";
pub const STREAM_TIMEOUT: Duration = Duration::from_secs(30);
}
Build Information
#![allow(unused)]
fn main() {
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const BUILD_TARGET: &str = env!("TARGET");
pub const BUILD_TIMESTAMP: &str = env!("BUILD_TIMESTAMP");
}
Feature Flags
Conditional Compilation
#![allow(unused)]
fn main() {
#[cfg(feature = "spectrum-analyzer")]
pub mod spectrum {
// Spectrum analyzer functionality
}
#[cfg(not(feature = "spectrum-analyzer"))]
pub mod spectrum {
// Stub implementation
}
}
This API reference provides the essential interfaces for working with SomaFM Player’s codebase. For complete type information and implementation details, refer to the generated API Documentation.