// Copyright Epic Games, Inc. All Rights Reserved. #include "print.h" #include #include #include #include #include using namespace std::literals; namespace zen { PrintCommand::PrintCommand() { m_Options.add_options()("h,help", "Print help"); m_Options.add_option("", "s", "source", "Object payload file", cxxopts::value(m_Filename), ""); } PrintCommand::~PrintCommand() = default; int PrintCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_UNUSED(GlobalOptions, argc, argv); m_Options.parse_positional({"source"}); auto result = m_Options.parse(argc, argv); if (result.count("help")) { std::cout << m_Options.help({"", "Group"}) << std::endl; return 0; } // Validate arguments if (m_Filename.empty()) throw std::runtime_error("No file specified"); zen::FileContents Fc = zen::ReadFile(m_Filename); if (Fc.ErrorCode) { zen::ConsoleLog().error("Failed to open file '{}': {}", m_Filename, Fc.ErrorCode.message()); return 1; } IoBuffer Data = Fc.Flatten(); if (CbValidateError Result = ValidateCompactBinary(Data, CbValidateMode::All); Result != CbValidateError::None) { zen::ConsoleLog().error("Data in file '{}' does not appear to be compact binary (validation error {:#x})", m_Filename, uint32_t(Result)); return 1; } zen::CbObject Object{SharedBuffer(Data)}; zen::StringBuilder<1024> ObjStr; zen::CompactBinaryToJson(Object, ObjStr); zen::ConsoleLog().info("{}", ObjStr); return 0; } ////////////////////////////////////////////////////////////////////////// PrintPackageCommand::PrintPackageCommand() { m_Options.add_options()("h,help", "Print help"); m_Options.add_option("", "s", "source", "Package payload file", cxxopts::value(m_Filename), ""); } PrintPackageCommand::~PrintPackageCommand() { } int PrintPackageCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_UNUSED(GlobalOptions, argc, argv); m_Options.parse_positional({"source"}); auto result = m_Options.parse(argc, argv); if (result.count("help")) { std::cout << m_Options.help({"", "Group"}) << std::endl; return 0; } // Validate arguments if (m_Filename.empty()) throw std::runtime_error("No file specified"); zen::FileContents Fc = zen::ReadFile(m_Filename); IoBuffer Data = Fc.Flatten(); zen::CbPackage Package; bool Ok = Package.TryLoad(Data) || zen::legacy::TryLoadCbPackage(Package, Data, &UniqueBuffer::Alloc); if (Ok) { zen::StringBuilder<1024> ObjStr; zen::CompactBinaryToJson(Package.GetObject(), ObjStr); zen::ConsoleLog().info("{}", ObjStr); } else { zen::ConsoleLog().error("error: malformed package?"); } return 0; } } // namespace zen