darpan 0.2.2

Linux developer service monitoring utility with auto-detection, real-time health checks, and interactive TUI for databases, APIs, Docker containers, and more
Documentation
use crate::models::{CacheType, DatabaseType, SearchType, ServiceType};

pub struct ServiceSignature {
    pub port: u16,
    pub process_pattern: &'static str,
    pub service_type: ServiceType,
    pub name: &'static str,
    pub systemd_unit: Option<&'static str>,
}

pub struct ServiceSignatures;

impl ServiceSignatures {
    pub fn all() -> Vec<ServiceSignature> {
        vec![
            // Databases
            ServiceSignature {
                port: 5432,
                process_pattern: "postgres",
                service_type: ServiceType::Database { database: DatabaseType::Postgres },
                name: "PostgreSQL",
                systemd_unit: Some("postgresql.service"),
            },
            ServiceSignature {
                port: 3306,
                process_pattern: "mysqld",
                service_type: ServiceType::Database { database: DatabaseType::MySQL },
                name: "MySQL",
                systemd_unit: Some("mysql.service"),
            },
            ServiceSignature {
                port: 27017,
                process_pattern: "mongod",
                service_type: ServiceType::Database { database: DatabaseType::MongoDB },
                name: "MongoDB",
                systemd_unit: Some("mongod.service"),
            },
            // Cache/Queue
            ServiceSignature {
                port: 6379,
                process_pattern: "redis-server",
                service_type: ServiceType::Cache { cache: CacheType::Redis },
                name: "Redis",
                systemd_unit: Some("redis-server.service"),
            },
            ServiceSignature {
                port: 11211,
                process_pattern: "memcached",
                service_type: ServiceType::Cache { cache: CacheType::Memcached },
                name: "Memcached",
                systemd_unit: Some("memcached.service"),
            },
            // Search
            ServiceSignature {
                port: 9200,
                process_pattern: "elasticsearch",
                service_type: ServiceType::Search { search: SearchType::Elasticsearch },
                name: "Elasticsearch",
                systemd_unit: Some("elasticsearch.service"),
            },
            ServiceSignature {
                port: 7700,
                process_pattern: "meilisearch",
                service_type: ServiceType::Search { search: SearchType::Meilisearch },
                name: "Meilisearch",
                systemd_unit: Some("meilisearch.service"),
            },
            // Development servers (common ports - no systemd units typically)
            ServiceSignature {
                port: 3000,
                process_pattern: "node",
                service_type: ServiceType::HttpServer,
                name: "Node.js Dev Server",
                systemd_unit: None,
            },
            ServiceSignature {
                port: 8000,
                process_pattern: "python",
                service_type: ServiceType::HttpServer,
                name: "Python Dev Server",
                systemd_unit: None,
            },
            ServiceSignature {
                port: 8080,
                process_pattern: "java",
                service_type: ServiceType::HttpServer,
                name: "Java Server",
                systemd_unit: None,
            },
            ServiceSignature {
                port: 4200,
                process_pattern: "node",
                service_type: ServiceType::HttpServer,
                name: "Angular Dev Server",
                systemd_unit: None,
            },
            ServiceSignature {
                port: 5173,
                process_pattern: "node",
                service_type: ServiceType::HttpServer,
                name: "Vite Dev Server",
                systemd_unit: None,
            },
        ]
    }

    pub fn find_by_port(port: u16) -> Option<ServiceSignature> {
        Self::all().into_iter().find(|sig| sig.port == port)
    }

    pub fn find_by_process(process_name: &str) -> Option<ServiceSignature> {
        Self::all()
            .into_iter()
            .find(|sig| process_name.contains(sig.process_pattern))
    }
}