// Copyright 2021 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.

#include <utility>

#include "hermes/hermes_common.h"

#include <base/logging.h>

namespace hermes {

std::string GetTrailingChars(const std::string& pii, int num_chars) {
  DCHECK_GE(num_chars, 0);
  if (num_chars > pii.length())
    return pii;
  return pii.substr(pii.length() - num_chars);
}

std::string GetObjectPathForLog(const dbus::ObjectPath& dbus_path) {
  const std::string kPrefix = "dbus_path(Last 3 chars): ";
  const int kDbusPathPrintLen = 3;
  return kPrefix + GetTrailingChars(dbus_path.value(), kDbusPathPrintLen);
}

void IgnoreErrorRunClosure(base::OnceCallback<void()> cb, int err) {
  VLOG(2) << "Modem message processed with code:" << err;
  std::move(cb).Run();
}

void PrintMsgProcessingResult(int err) {
  VLOG(2) << "Modem processed message processed with code:" << err;
}

void RunNextStep(
    base::OnceCallback<void(base::OnceCallback<void(int)>)> next_step,
    base::OnceCallback<void(int)> cb,
    int err) {
  VLOG(2) << "Modem message processed with code:" << err;
  if (err) {
    std::move(cb).Run(err);
    return;
  }
  std::move(next_step).Run(std::move(cb));
}

}  // namespace hermes
