// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "cbor/parse.h"

#include <cstdint>
#include <memory>
#include <utility>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "cbor/cbor.h"
#include "cppbor/cppbor_parse.h"

namespace cbor {

absl::StatusOr<std::unique_ptr<ParseResult>> Parse(absl::string_view s) {
  const uint8_t* data = reinterpret_cast<const uint8_t*>(s.data());
  const uint8_t* end = data + s.size();
  auto [item, new_position, error] = cppbor::parse(data, end);
  if (!error.empty()) {
    return absl::InvalidArgumentError(
        absl::StrCat("CBOR parsing failed: ", error));
  }
  if (new_position != end) {
    return absl::InvalidArgumentError(
        "Trailing bytes after the parsed CBOR item");
  }
  return std::make_unique<ParseResult>(std::move(item));
}

}  // namespace cbor
