// Copyright 2021 The Crashpad Authors. All rights reserved.
//
// 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
//
//     http://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 "snapshot/ios/intermediate_dump_reader_util.h"

#include "util/ios/ios_intermediate_dump_data.h"
#include "util/ios/ios_intermediate_dump_map.h"
#include "util/misc/metrics.h"

namespace crashpad {
namespace internal {

std::ostream& operator<<(std::ostream& os, const IntermediateDumpKey& t) {
  switch (t) {
#define X(Name, Value)            \
  case IntermediateDumpKey::Name: \
    os << #Name;                  \
    break;
    INTERMEDIATE_DUMP_KEYS(X)
#undef X
  }
  return os;
}

const IOSIntermediateDumpData* GetDataFromMap(
    const IOSIntermediateDumpMap* map,
    const IntermediateDumpKey& key,
    LogMissingDataValueFromMap logging) {
  const IOSIntermediateDumpData* data = map->GetAsData(key);
  if (!data) {
    if (logging != LogMissingDataValueFromMap::kDontLogIfMissing) {
      LOG(ERROR) << "Missing expected data for key " << key;
      Metrics::MissingIntermediateDumpKey(key);
    }
    return nullptr;
  }
  return data;
}

const IOSIntermediateDumpMap* GetMapFromMap(const IOSIntermediateDumpMap* map,
                                            const IntermediateDumpKey& key) {
  const IOSIntermediateDumpMap* map_dump = map->GetAsMap(key);
  if (!map_dump) {
    LOG(ERROR) << "Missing expected map for key " << key;
    Metrics::MissingIntermediateDumpKey(key);
    return nullptr;
  }
  return map_dump;
}

const IOSIntermediateDumpList* GetListFromMap(const IOSIntermediateDumpMap* map,
                                              const IntermediateDumpKey& key) {
  const IOSIntermediateDumpList* list = map->GetAsList(key);
  if (!list) {
    LOG(ERROR) << "Missing expected list for key " << key;
    Metrics::MissingIntermediateDumpKey(key);
    return nullptr;
  }
  return list;
}

bool GetDataStringFromMap(const IOSIntermediateDumpMap* map,
                          const IntermediateDumpKey& key,
                          std::string* value) {
  const IOSIntermediateDumpData* data = GetDataFromMap(map, key);
  if (!data) {
    LOG(ERROR) << "Missing expected string for key " << key;
    Metrics::MissingIntermediateDumpKey(key);
    return false;
  }

  *value = data->GetString();
  return true;
}

void GetDataValueFromMapErrorInternal(const IntermediateDumpKey& key) {
  LOG(ERROR) << "Invalid key size: " << key;
  Metrics::InvalidIntermediateDumpKeySize(key);
}

}  // namespace internal
}  // namespace crashpad
