// 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/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));
  }
  return std::make_unique<ParseResult>(std::move(item));
}

}  // namespace cbor
