///|
pub fn FileStat::to_log_string(self : FileStat) -> String {
  "FileStat(file_type=\{self.file_type}, size=\{self.size}, mtime=\{self.mtime}, ctime=\{self.ctime})"
}

///|
pub fn SysMessage::to_log_string(self : SysMessage) -> String {
  match self {
    Register(task_uuid~, hostname~, cwd~, proto_version~, server_capabilities~) =>
      "Sys(Register task_uuid=\{task_uuid} hostname=\{@debug.to_string(hostname)} cwd=\{@debug.to_string(cwd)} proto_version=\{proto_version} server_capabilities=\{server_capabilities.to_log_string()})"
    Registered(task_uuid~) => "Sys(Registered task_uuid=\{task_uuid})"
    RegisterRejected(reason~) =>
      "Sys(RegisterRejected reason=\{reason.to_wire()})"
    TaskExited(exit_code~) => "Sys(TaskExited exit_code=\{exit_code})"
    Title(title~) =>
      "Sys(Title title_len=\{title.map(value => value.length()).unwrap_or(0)})"
    Connect(task_uuid~, last_seen_id~, proto_version~, client_capabilities~) =>
      "Sys(Connect task_uuid=\{task_uuid} last_seen_id=\{@debug.to_string(last_seen_id)} proto_version=\{proto_version} client_capabilities=\{client_capabilities.to_log_string()})"
    Connected(server_proto_version~, server_capabilities~) =>
      "Sys(Connected server_proto_version=\{server_proto_version} server_capabilities=\{server_capabilities.to_log_string()})"
    TaskOnline(server_proto_version~, server_capabilities~) =>
      "Sys(TaskOnline server_proto_version=\{server_proto_version} server_capabilities=\{server_capabilities.to_log_string()})"
    NewClient(
      client_id~,
      last_seen_id~,
      client_proto_version~,
      client_capabilities~
    ) =>
      "Sys(NewClient client_id=\{@debug.to_string(client_id)} last_seen_id=\{@debug.to_string(last_seen_id)} client_proto_version=\{client_proto_version} client_capabilities=\{client_capabilities.to_log_string()})"
    ClientDisconnected(client_id~) =>
      "Sys(ClientDisconnected client_id=\{@debug.to_string(client_id)})"
    Error(code) => "Sys(Error code=\{code.to_wire()})"
    AuthError(message~) => "Sys(AuthError message=\{@debug.to_string(message)})"
  }
}

///|
pub fn TermMessage::to_log_string(self : TermMessage) -> String {
  match self {
    ClientReplayCursor(client_id~, last_seen_id~) =>
      "Term(ClientReplayCursor client_id=\{@debug.to_string(client_id)} last_seen_id=\{@debug.to_string(last_seen_id)})"
    Viewport(client_id~, cols~, rows~, active~) =>
      "Term(Viewport client_id=\{@debug.to_string(client_id)} cols=\{cols} rows=\{rows} active=\{active})"
    RenderFrame(
      client_id~,
      seq~,
      cols~,
      rows~,
      scroll_offset~,
      scrollback_rows~,
      title~,
      data~,
      ..
    ) => {
      let title_len = match title {
        Some(value) => value.length()
        None => 0
      }
      "Term(RenderFrame client_id=\{@debug.to_string(client_id)} seq=\{seq} cols=\{cols} rows=\{rows} scroll_offset=\{scroll_offset} scrollback_rows=\{scrollback_rows} title_len=\{title_len} data_len=\{data.length()})"
    }
    RenderState(
      client_id~,
      seq~,
      cols~,
      rows~,
      scroll_offset~,
      scrollback_rows~,
      title~,
      frame~,
      ..
    ) => {
      let title_len = match title {
        Some(value) => value.length()
        None => 0
      }
      "Term(RenderState client_id=\{@debug.to_string(client_id)} seq=\{seq} cols=\{cols} rows=\{rows} scroll_offset=\{scroll_offset} scrollback_rows=\{scrollback_rows} title_len=\{title_len} full=\{frame.full} lines=\{frame.lines.length()} styles=\{frame.styles.length()})"
    }
    InputText(client_id~, text~) =>
      "Term(InputText client_id=\{@debug.to_string(client_id)} text_len=\{text.length()})"
    InputKey(client_id~, key~, mods~, text~) => {
      let text_len = match text {
        Some(value) => value.length()
        None => 0
      }
      "Term(InputKey client_id=\{@debug.to_string(client_id)} key=\{@debug.to_string(key)} mods=\{mods.length()} text_len=\{text_len})"
    }
    InputPaste(client_id~, text~) =>
      "Term(InputPaste client_id=\{@debug.to_string(client_id)} text_len=\{text.length()})"
    InputMouse(client_id~, x~, y~, button~, action~, mods~) =>
      "Term(InputMouse client_id=\{@debug.to_string(client_id)} x=\{x} y=\{y} button=\{@debug.to_string(button)} action=\{@debug.to_string(action)} mods=\{mods.length()})"
    InputScroll(client_id~, x~, y~, delta_rows~, mods~) =>
      "Term(InputScroll client_id=\{@debug.to_string(client_id)} x=\{x} y=\{y} delta_rows=\{delta_rows} mods=\{mods.length()})"
    ScrollToLive(client_id~) =>
      "Term(ScrollToLive client_id=\{@debug.to_string(client_id)})"
    Theme(client_id~, background~, foreground~) =>
      "Term(Theme client_id=\{@debug.to_string(client_id)} background=\{@debug.to_string(background)} foreground=\{@debug.to_string(foreground)})"
    Data(client_id~, id~, created~, replay~, data~) =>
      "Term(Data client_id=\{@debug.to_string(client_id)} id=\{id} created=\{@debug.to_string(created)} replay=\{@debug.to_string(replay)} data_len=\{data.length()})"
    Exited(client_id~, id~) =>
      "Term(Exited client_id=\{@debug.to_string(client_id)} id=\{id})"
  }
}

///|
pub fn FsMessage::to_log_string(self : FsMessage) -> String {
  match self {
    WatchFile(req_id~, client_id~, path~) =>
      "Fs(WatchFile req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)})"
    UnwatchFile(req_id~, client_id~) =>
      "Fs(UnwatchFile req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)})"
    WatchFileReady(req_id~, client_id~, path~, resolved_path~) =>
      "Fs(WatchFileReady req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)} resolved_path=\{@debug.to_string(resolved_path)})"
    FileChanged(req_id~, client_id~, path~, resolved_path~) =>
      "Fs(FileChanged req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)} resolved_path=\{@debug.to_string(resolved_path)})"
    Stat(req_id~, client_id~, path~) =>
      "Fs(Stat req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)})"
    StatResult(req_id~, client_id~, stat~) =>
      "Fs(StatResult req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} stat=\{stat.to_log_string()})"
    Readdir(req_id~, client_id~, path~) =>
      "Fs(Readdir req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)})"
    ReaddirResult(req_id~, client_id~, entries~) =>
      "Fs(ReaddirResult req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} entries=\{entries.length()})"
    ReadFile(req_id~, client_id~, path~) =>
      "Fs(ReadFile req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)})"
    ReadFileResult(req_id~, client_id~, data~) =>
      "Fs(ReadFileResult req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} data_len=\{data.length()})"
    WriteFile(req_id~, client_id~, path~, data~, create~, overwrite~) =>
      "Fs(WriteFile req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)} data_len=\{data.length()} create=\{create} overwrite=\{overwrite})"
    Mkdir(req_id~, client_id~, path~) =>
      "Fs(Mkdir req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)})"
    FsDelete(req_id~, client_id~, path~, recursive~) =>
      "Fs(Delete req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} path=\{@debug.to_string(path)} recursive=\{recursive})"
    FsRename(req_id~, client_id~, from~, to~, overwrite~) =>
      "Fs(Rename req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} from=\{@debug.to_string(from)} to=\{@debug.to_string(to)} overwrite=\{overwrite})"
    FsOk(req_id~, client_id~) =>
      "Fs(Ok req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)})"
    FsError(req_id~, client_id~, code~, message~) =>
      "Fs(Error req_id=\{@debug.to_string(req_id)} client_id=\{@debug.to_string(client_id)} code=\{@debug.to_string(code)} message=\{@debug.to_string(message)})"
  }
}

///|
pub fn Message::to_log_string(self : Message) -> String {
  match self {
    Sys(msg) => msg.to_log_string()
    Fs(msg) => msg.to_log_string()
    Ide(msg) => msg.to_log_string()
    Term(msg) => msg.to_log_string()
    Codex(client_id~, data~) =>
      "Codex(client_id=\{@debug.to_string(client_id)} data_len=\{data.length()})"
  }
}