windjammer 0.48.0

A simple language inspired by Go, Ruby, and Elixir that transpiles to Rust - 80% of Rust's power with 20% of the complexity
Documentation
// Message types for wschat

use std::time

// Client → Server messages
@derive(Debug, Serialize, Deserialize)
pub enum ClientMessage {
    Auth { token: string }
    Join { room: string }
    Leave { room: string }
    Message { room: string, text: string }
    DirectMessage { to: string, text: string }
    Typing { room: string, status: bool }
    ListUsers { room: string }
    History { room: string, limit: Option<int> }
    Ping,
}

// Server → Client messages
@derive(Debug, Serialize, Deserialize)
pub enum ServerMessage {
    Welcome { user_id: string, username: string }
    Joined { room: string, users: Vec<UserInfo> }
    Left { room: string }
    Message { 
        room: string, 
        from: string, 
        text: string, 
        timestamp: int,
    }
    DirectMessage { 
        from: string, 
        text: string, 
        timestamp: int,
    }
    Presence { 
        room: string, 
        user: string, 
        status: PresenceStatus,
    }
    Typing { 
        room: string, 
        user: string, 
        status: bool,
    }
    UserList { 
        room: string, 
        users: Vec<UserInfo>,
    }
    History { 
        room: string, 
        messages: Vec<HistoryMessage>,
    }
    Error { message: string }
    Pong,
}

@derive(Debug, Clone, Serialize, Deserialize)
pub struct UserInfo {
    pub user_id: string,
    pub username: string,
    pub status: PresenceStatus,
}

@derive(Debug, Clone, Serialize, Deserialize)
pub enum PresenceStatus {
    Online,
    Away,
    Offline,
}

@derive(Debug, Clone, Serialize, Deserialize)
pub struct HistoryMessage {
    pub from: string,
    pub text: string,
    pub timestamp: int,
}

@derive(Debug, Clone)
pub struct InternalMessage {
    pub from_user: string,
    pub to_room: string,
    pub text: string,
    pub timestamp: int,
}

impl InternalMessage {
    pub fn new(from: string, room: string, text: string) -> Self {
        InternalMessage {
            from_user: from,
            to_room: room,
            text: text,
            timestamp: time.now_unix(),
        }
    }
    
    pub fn to_server_message(self) -> ServerMessage {
        ServerMessage::Message {
            room: self.to_room,
            from: self.from_user,
            text: self.text,
            timestamp: self.timestamp,
        }
    }
    
    pub fn to_history_message(self) -> HistoryMessage {
        HistoryMessage {
            from: self.from_user,
            text: self.text,
            timestamp: self.timestamp,
        }
    }
}

// Parse client message from JSON text
pub fn parse_client_message(text: string) -> Result<ClientMessage, Error> {
    json.parse::<ClientMessage>(text)
}

// Serialize server message to JSON text
pub fn serialize_server_message(msg: ServerMessage) -> Result<string, Error> {
    json.stringify(msg)
}