///|
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~) =>
      "Sys(Register task_uuid=\{task_uuid} hostname=\{@debug.to_string(hostname)} cwd=\{@debug.to_string(cwd)})"
    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})"
    Connect(task_uuid~, last_seen_id~) =>
      "Sys(Connect task_uuid=\{task_uuid} last_seen_id=\{@debug.to_string(last_seen_id)})"
    Connected => "Sys(Connected)"
    TaskOnline => "Sys(TaskOnline)"
    NewClient(client_id~, last_seen_id~) =>
      "Sys(NewClient client_id=\{@debug.to_string(client_id)} last_seen_id=\{@debug.to_string(last_seen_id)})"
    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 {
    Data(client_id~, id~, data~) =>
      "Term(Data client_id=\{@debug.to_string(client_id)} id=\{id} 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 {
    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()
    Term(msg) => msg.to_log_string()
    Codex(client_id~, data~) =>
      "Codex(client_id=\{@debug.to_string(client_id)} data_len=\{data.length()})"
  }
}