blob: 5fe8106013868ea7144d8463180868c2f7e66ed6 [file] [edit]
// Copyright 2026 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef TOOLS_GN_FFI_VALUE_H_
#define TOOLS_GN_FFI_VALUE_H_
#include <memory>
#include "cxx.h"
#include "gn/value.h"
class Scope;
class ParseNode;
struct SliceAny;
enum class ValueType : uint8_t;
// Teach rust how to convert Value::Type to an enum that rust is aware of.
namespace rust {
ValueType cxx_to_rust(Value::Type t);
}
size_t ValueSize();
// SetValue* is called with potentially uninitialized Value objects.
// These functions roughly correspond to calling the corresponding constructor
// with in-place construction.
void SetValueNone(Value& self, const ParseNode* origin);
void SetValueBool(Value& self, const ParseNode* origin, bool b);
void SetValueInt(Value& self, const ParseNode* origin, int64_t i);
void SetValueString(Value& self, const ParseNode* origin, rust::Str s);
struct Any;
// Sets the value to a list of `size` elements. Returns a pointer to the start
// of the vector.
//
// Safety: Rust is required to convert this to a Slice<Value>(pointer, size)
Any* SetValueList(Value& self, const ParseNode* origin, size_t size);
void SetValueScope(Value& self,
const ParseNode* origin,
std::unique_ptr<Scope> scope);
// Returns a "std::vector<Value>".
//
// Safety: Rust is required to convert this to a Slice<Value>.
SliceAny GetValueList(const Value& self);
// GN values are never created in starlark in production code.
// If a value may ever be returned, it will be passed as a mutable output
// parameter.
std::unique_ptr<Value> NewValueForTesting();
#endif // TOOLS_GN_FFI_VALUE_H_