blob: 065e0e31889cef4e04ac02c0f52d5d3431b58d9d [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "tools/fidl/fidlc/src/transport.h"
namespace fidlc {
std::string_view HandleClassName(HandleClass handle_class) {
switch (handle_class) {
case HandleClass::kZircon:
return "zx.Handle";
case HandleClass::kDriver:
return "fdf.handle";
case HandleClass::kBanjo:
return "[banjo]";
};
}
std::optional<HandleClass> HandleClassFromName(std::string_view name) {
if (name == "zx.Handle") {
return HandleClass::kZircon;
}
if (name == "fdf.handle") {
return HandleClass::kDriver;
}
return std::nullopt;
}
bool Transport::IsCompatible(HandleClass handle_class) const {
return compatible_handle_classes.find(handle_class) != compatible_handle_classes.end();
}
const Transport* Transport::FromTransportName(std::string_view transport_name) {
for (const Transport& transport : transports) {
if (transport.name == transport_name) {
return &transport;
}
}
return nullptr;
}
std::set<std::string_view> Transport::AllTransportNames() {
std::set<std::string_view> names;
for (const auto& entry : transports) {
names.insert(entry.name);
}
return names;
}
std::vector<Transport> Transport::transports = {
Transport{
.kind = Kind::kZirconChannel,
.name = "Channel",
.handle_class = HandleClass::kZircon,
.compatible_handle_classes = {HandleClass::kZircon},
},
Transport{
.kind = Kind::kDriverChannel,
.name = "Driver",
.handle_class = HandleClass::kDriver,
.compatible_handle_classes = {HandleClass::kZircon, HandleClass::kDriver},
},
Transport{
.kind = Kind::kBanjo,
.name = "Banjo",
.handle_class = HandleClass::kBanjo,
.compatible_handle_classes = {HandleClass::kZircon, HandleClass::kBanjo},
},
Transport{
.kind = Kind::kSyscall,
.name = "Syscall",
.compatible_handle_classes = {HandleClass::kZircon},
},
};
} // namespace fidlc