From 6e1483243c0c6f4d773f0e6b4a60569385684eae Mon Sep 17 00:00:00 2001 From: Katarzyna Miernikiewicz Date: Thu, 10 Sep 2020 15:42:00 +0000 Subject: [PATCH] jsonnet formatter added --- oss-internship-2020/jsonnet/CMakeLists.txt | 1 + .../jsonnet/examples/CMakeLists.txt | 2 +- .../jsonnet_codes/formatter_example.jsonnet | 18 +++ .../examples/jsonnet_formatter_example.cc | 118 ++++++++++++++++++ oss-internship-2020/jsonnet/jsonnet_helper.cc | 10 +- oss-internship-2020/jsonnet/jsonnet_helper.h | 17 ++- 6 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 oss-internship-2020/jsonnet/examples/jsonnet_codes/formatter_example.jsonnet create mode 100644 oss-internship-2020/jsonnet/examples/jsonnet_formatter_example.cc diff --git a/oss-internship-2020/jsonnet/CMakeLists.txt b/oss-internship-2020/jsonnet/CMakeLists.txt index 2d0314a..f3d1ec4 100644 --- a/oss-internship-2020/jsonnet/CMakeLists.txt +++ b/oss-internship-2020/jsonnet/CMakeLists.txt @@ -43,6 +43,7 @@ add_sapi_library(jsonnet_sapi c_write_multi_output_files c_write_output_stream c_jsonnet_evaluate_snippet_stream + c_jsonnet_fmt_snippet INPUTS jsonnet_helper.h LIBRARY jsonnet_helper LIBRARY_NAME Jsonnet diff --git a/oss-internship-2020/jsonnet/examples/CMakeLists.txt b/oss-internship-2020/jsonnet/examples/CMakeLists.txt index 01b0b9b..4044288 100644 --- a/oss-internship-2020/jsonnet/examples/CMakeLists.txt +++ b/oss-internship-2020/jsonnet/examples/CMakeLists.txt @@ -39,7 +39,7 @@ target_link_libraries(jsonnet_helper libjsonnet_for_binaries ) -foreach(exe base multiple_files yaml_stream) +foreach(exe base multiple_files yaml_stream formatter) add_executable(jsonnet_${exe}_sandboxed jsonnet_${exe}_example.cc ) diff --git a/oss-internship-2020/jsonnet/examples/jsonnet_codes/formatter_example.jsonnet b/oss-internship-2020/jsonnet/examples/jsonnet_codes/formatter_example.jsonnet new file mode 100644 index 0000000..cc983ea --- /dev/null +++ b/oss-internship-2020/jsonnet/examples/jsonnet_codes/formatter_example.jsonnet @@ -0,0 +1,18 @@ +// This is a poorly written jsonnet file. Given to the formatter executable will be changed into a canonical jsonnet file form. +local b = import "somefile.libsonnet"; # comment +local a = import "differentfile.libsonnet"; // another comment in different style + +local SomeStuff = {bar: "foo"}; + + local funtion_to_do_addition(x,y)=x+y; + + { +"this": ((3)) , +"that that": +funtion_to_do_addition(4,2), +arrArr: [[ + 1, 2, 5 + ], + 3, 10, 19 + ] +} + SomeStuff diff --git a/oss-internship-2020/jsonnet/examples/jsonnet_formatter_example.cc b/oss-internship-2020/jsonnet/examples/jsonnet_formatter_example.cc new file mode 100644 index 0000000..5aadb1b --- /dev/null +++ b/oss-internship-2020/jsonnet/examples/jsonnet_formatter_example.cc @@ -0,0 +1,118 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include +#include + +#include "jsonnet_sapi.sapi.h" + +class JsonnetSapiSandbox : public JsonnetSandbox { + public: + explicit JsonnetSapiSandbox(std::string in_file, std::string out_file) + : in_file_(std::move(in_file)), out_file_(std::move(out_file)) {} + + std::unique_ptr ModifyPolicy( + sandbox2::PolicyBuilder *) override { + return sandbox2::PolicyBuilder() + .AllowStaticStartup() + .AllowOpen() + .AllowRead() + .AllowWrite() + .AllowStat() + .AllowSystemMalloc() + .AllowExit() + .AllowSyscalls({ + __NR_futex, + __NR_close, + }) + .AddDirectoryAt(dirname(&out_file_[0]), "/output", /*is_ro=*/false) + .AddFile(in_file_, true) + .BuildOrDie(); + } + + private: + std::string in_file_; + std::string out_file_; +}; + +int main(int argc, char *argv[]) { + google::InitGoogleLogging(argv[0]); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (!(argc == 3)) { + std::cerr << "Usage:\n" + << basename(argv[0]) << " absolute/path/to/INPUT.jsonnet" + << " absolute/path/to/OUTPUT.jsonnet\n"; + return EXIT_FAILURE; + } + + std::string in_file(argv[1]); + std::string out_file(argv[2]); + + // Initialize sandbox. + JsonnetSapiSandbox sandbox(in_file, out_file); + absl::Status status = sandbox.Init(); + CHECK(status.ok()) << "Sandbox initialization failed " << status; + + JsonnetApi api(&sandbox); + + // Initialize library's main structure. + sapi::StatusOr jsonnet_vm = api.c_jsonnet_make(); + sapi::v::RemotePtr vm_pointer(jsonnet_vm.value()); + CHECK(jsonnet_vm.ok()) << "JsonnetVm initialization failed: " + << jsonnet_vm.status(); + + // Read input file. + sapi::v::ConstCStr in_file_var(in_file.c_str()); + sapi::StatusOr input = + api.c_read_input(false, in_file_var.PtrBefore()); + CHECK(input.ok()) << "Reading input file failed " << input.status(); + + // Process jsonnet data. + sapi::v::RemotePtr input_pointer(input.value()); + sapi::v::Int error; + sapi::StatusOr output = api.c_jsonnet_fmt_snippet( + &vm_pointer, in_file_var.PtrBefore(), &input_pointer, error.PtrAfter()); + CHECK(output.ok() && !error.GetValue()) + << "Jsonnet code evaluation failed: " << output.status() << " " + << error.GetValue(); + + // Write data to file. + std::string out_file_in_sandboxee(std::string("/output/") + + basename(&out_file[0])); + sapi::v::ConstCStr out_file_var(out_file_in_sandboxee.c_str()); + sapi::v::RemotePtr output_pointer(output.value()); + sapi::StatusOr success; + + success = api.c_write_output_file(&output_pointer, out_file_var.PtrBefore()); + CHECK(success.ok() && success.value()) + << "Writing to output file failed " << success.status() << " " + << success.value(); + + // Clean up. + sapi::StatusOr result = + api.c_jsonnet_realloc(&vm_pointer, &output_pointer, 0); + CHECK(result.ok()) << "JsonnetVm realloc failed: " << result.status(); + + status = api.c_jsonnet_destroy(&vm_pointer); + CHECK(status.ok()) << "JsonnetVm destroy failed: " << status; + + status = api.c_free_input(&input_pointer); + CHECK(status.ok()) << "Input freeing failed: " << status; + + return EXIT_SUCCESS; +} diff --git a/oss-internship-2020/jsonnet/jsonnet_helper.cc b/oss-internship-2020/jsonnet/jsonnet_helper.cc index 26c39e5..a17df84 100644 --- a/oss-internship-2020/jsonnet/jsonnet_helper.cc +++ b/oss-internship-2020/jsonnet/jsonnet_helper.cc @@ -58,16 +58,20 @@ bool c_write_output_file(const char* output, const char* output_file) { return write_output_file(output, s_output_file); } -bool c_write_multi_output_files(JsonnetVm* vm, char* output, char* output_dir) { +bool c_write_multi_output_files(struct JsonnetVm* vm, char* output, char* output_dir) { std::string s_output_dir(output_dir); return write_multi_output_files(vm, output, s_output_dir); } -bool c_write_output_stream(JsonnetVm* vm, char* output, char* output_file) { +bool c_write_output_stream(struct JsonnetVm* vm, char* output, char* output_file) { std::string s_output_file(output_file); return write_output_stream(vm, output, s_output_file); } -char* c_jsonnet_realloc(JsonnetVm* vm, char* str, size_t sz) { +char* c_jsonnet_realloc(struct JsonnetVm* vm, char* str, size_t sz) { return jsonnet_realloc(vm, str, sz); } + +char* c_jsonnet_fmt_snippet(struct JsonnetVm* vm, const char* filename, const char* snippet, int* error) { + return jsonnet_fmt_snippet(vm, filename, snippet, error); +} diff --git a/oss-internship-2020/jsonnet/jsonnet_helper.h b/oss-internship-2020/jsonnet/jsonnet_helper.h index 66b7620..d9104a1 100644 --- a/oss-internship-2020/jsonnet/jsonnet_helper.h +++ b/oss-internship-2020/jsonnet/jsonnet_helper.h @@ -16,6 +16,7 @@ extern "C" { #include +#include } extern "C" struct JsonnetVm* c_jsonnet_make(void); @@ -43,14 +44,20 @@ extern "C" void c_free_input(char* input); extern "C" bool c_write_output_file(const char* output, const char* output_file); -extern "C" char* c_jsonnet_realloc(JsonnetVm* vm, char* str, size_t sz); +extern "C" char* c_jsonnet_realloc(struct JsonnetVm* vm, char* str, size_t sz); -extern "C" bool c_write_multi_output_files(JsonnetVm* vm, char* output, +extern "C" bool c_write_multi_output_files(struct JsonnetVm* vm, char* output, char* output_dir); -bool write_multi_output_files(JsonnetVm* vm, char* output, +bool write_multi_output_files(struct JsonnetVm* vm, char* output, const std::string& output_dir); -extern "C" bool c_write_output_stream(JsonnetVm* vm, char* output, char* output_file); +extern "C" bool c_write_output_stream(struct JsonnetVm* vm, char* output, + char* output_file); -bool write_output_stream(JsonnetVm* vm, char* output, const std::string& output_file); +bool write_output_stream(struct JsonnetVm* vm, char* output, + const std::string& output_file); + +extern "C" char* c_jsonnet_fmt_snippet(struct JsonnetVm* vm, + const char* filename, + const char* snippet, int* error);