// Copyright Epic Games, Inc. All Rights Reserved. #include "vfs_cmd.h" #include #include #include #include #include #include #include #include namespace zen { using namespace std::literals; VfsCommand::VfsCommand() { m_Options.add_option("", "", "verb", "VFS management verb (mount, unmount, info)", cxxopts::value(m_Verb), ""); m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), ""); m_Options.add_option("", "", "vfs-path", "Specify VFS mount point path", cxxopts::value(m_MountPath), ""); m_Options.parse_positional({"verb", "vfs-path"}); } VfsCommand::~VfsCommand() { } void VfsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_UNUSED(GlobalOptions, argc, argv); if (!ParseOptions(argc, argv)) { return; } // Validate arguments m_HostName = ResolveTargetHostSpec(m_HostName); if (m_HostName.empty()) throw OptionParseException("Unable to resolve server specification", m_Options.help()); HttpClient Http = CreateHttpClient(m_HostName); if (m_Verb == "mount"sv) { if (m_MountPath.empty()) throw OptionParseException("'--vfs-path' is required", m_Options.help()); CbObjectWriter Cbo; Cbo << "method" << "mount"; Cbo.BeginObject("params"); Cbo << "path" << m_MountPath; Cbo.EndObject(); if (HttpClient::Response Result = Http.Post("/vfs"sv, Cbo.Save())) { } else { Result.ThrowError("VFS mount request failed"sv); } } else if (m_Verb == "unmount"sv) { CbObjectWriter Cbo; Cbo << "method" << "unmount"; if (HttpClient::Response Result = Http.Post("/vfs"sv, Cbo.Save())) { } else { Result.ThrowError("VFS unmount request failed"sv); } } else if (m_Verb == "info"sv) { if (HttpClient::Response Result = Http.Get(fmt::format("/vfs/info"))) { ExtendableStringBuilder<256> Json; Result.AsObject().ToJson(Json); ZEN_CONSOLE("{}", Json); } else { Result.ThrowError("VFS info fetch failed"sv); } } } } // namespace zen