/*
 * Copyright (C) 2020, The Android Open Source Project
 *
 * 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.
 */
#pragma once

#include "aidl_language.h"
#include "aidl_typenames.h"

namespace android {
namespace aidl {
namespace rust {

// This header provides functions that translate AIDL things to Rust things.

enum class StorageMode {
  VALUE,
  DEFAULT_VALUE,       // Value that implements Default::default()
  IN_ARGUMENT,         // Value for primitives, & for larger types
  UNSIZED_ARGUMENT,    // Unsized input argument, e.g., str/slice
  INTERFACE_ARGUMENT,  // Interface argument, e.g., dyn IFoo
  OUT_ARGUMENT,        // Mutable reference to write-only raw type
  INOUT_ARGUMENT,      // Mutable reference to inout argument
  PARCELABLE_FIELD,    // Field in a parcelable
};

enum class ReferenceMode {
  VALUE,
  REF,
  REF_DEREF,
  MUT_REF,
  AS_REF,
  AS_DEREF,
};

inline bool IsReference(ReferenceMode ref_mode) {
  switch (ref_mode) {
    case ReferenceMode::REF:
    case ReferenceMode::REF_DEREF:
    case ReferenceMode::MUT_REF:
      return true;

    default:
      return false;
  }
}

std::string ConstantValueDecorator(const AidlTypeSpecifier& type, const std::string& raw_value);

std::string ConstantValueDecoratorRef(const AidlTypeSpecifier& type, const std::string& raw_value);

// Returns the Rust type signature of the AIDL type spec
// This includes generic type parameters with array modifiers.
std::string RustNameOf(const AidlTypeSpecifier& aidl, const AidlTypenames& typenames,
                       StorageMode mode);

StorageMode ArgumentStorageMode(const AidlArgument& arg, const AidlTypenames& typenames);

ReferenceMode ArgumentReferenceMode(const AidlArgument& arg, const AidlTypenames& typenames);

std::string TakeReference(ReferenceMode ref_mode, const std::string& name);

bool TypeIsInterface(const AidlTypeSpecifier& type, const AidlTypenames& typenames);

bool TypeHasDefault(const AidlTypeSpecifier& type, const AidlTypenames& typenames);

}  // namespace rust
}  // namespace aidl
}  // namespace android
