// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // FLUTTER_NOLINT: https://github.com/flutter/flutter/issues/105732 #include #include #include #include "flutter/fml/command_line.h" #include "flutter/fml/file.h" #include "flutter/fml/logging.h" #include "flutter/fml/mapping.h" #include "inja/inja.hpp" namespace flutter { bool TemplaterMain(const fml::CommandLine& command_line) { std::string input_path; std::string output_path; if (!command_line.GetOptionValue("templater-input", &input_path)) { FML_LOG(ERROR) << "Input template path not specified. Use --templater-input."; return false; } if (!command_line.GetOptionValue("templater-output", &output_path)) { FML_LOG(ERROR) << "Input template path not specified. Use --templater-output."; return false; } auto input = fml::FileMapping::CreateReadOnly(input_path); if (!input) { FML_LOG(ERROR) << "Could not open input file: " << input_path; return false; } nlohmann::json arguments; for (const auto& option : command_line.options()) { arguments[option.name] = option.value; } inja::Environment env; auto rendered_template = env.render( std::string_view{reinterpret_cast(input->GetMapping()), input->GetSize()}, arguments); auto output = fml::NonOwnedMapping{ reinterpret_cast(rendered_template.data()), rendered_template.size()}; auto current_dir = fml::OpenDirectory(std::filesystem::current_path().u8string().c_str(), false, fml::FilePermission::kReadWrite); if (!current_dir.is_valid()) { FML_LOG(ERROR) << "Could not open current directory."; return false; } if (!fml::WriteAtomically(current_dir, output_path.c_str(), output)) { FML_LOG(ERROR) << "Could not write output to path: " << output_path; return false; } return true; } } // namespace flutter int main(int argc, char const* argv[]) { return flutter::TemplaterMain(fml::CommandLineFromArgcArgv(argc, argv)) ? EXIT_SUCCESS : EXIT_FAILURE; }