blob: 4cd0f230d8857e4bfdd4741ef14c22e0b432ba5e [file] [log] [blame]
// 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 <filesystem>
#include <string>
#include <string_view>
#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<const char*>(input->GetMapping()),
input->GetSize()},
arguments);
auto output = fml::NonOwnedMapping{
reinterpret_cast<const uint8_t*>(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;
}