// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CROSLOG_LOG_ENTRY_H_
#define CROSLOG_LOG_ENTRY_H_

#include <list>
#include <string>
#include <utility>

#include "base/strings/string_piece.h"
#include "base/time/time.h"

#include "croslog/severity.h"

namespace croslog {

class LogEntry {
 public:
  LogEntry(base::Time time,
           Severity severity,
           std::string&& tag,
           int pid,
           std::string&& message,
           std::string&& entire_string);
  LogEntry(LogEntry&& other) = default;
  LogEntry(const LogEntry&) = delete;
  LogEntry& operator=(const LogEntry&) = delete;

  const std::string& entire_line() const { return entire_line_; }
  base::Time time() const { return time_; }
  Severity severity() const { return severity_; }
  const std::string& tag() const { return tag_; }
  const int pid() const { return pid_; }
  const std::string& message() const { return message_; }

  // Appends lines to the message. This is usually for appending second and
  // after lines when parsing multiple-line logs.
  void AppendLinesToMessage(const std::list<std::string>& lines);

 private:
  const base::Time time_;
  const Severity severity_;
  const std::string tag_;
  const int pid_;
  std::string message_;
  std::string entire_line_;
};

}  // namespace croslog

#endif  // CROSLOG_LOG_ENTRY_H_
