/* * Copyright 2022 WebAssembly Community Group participants * * 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. */ #ifndef wasm_wat_parser_h #define wasm_wat_parser_h #include #include "wasm.h" namespace wasm::WATParser { struct Ok {}; struct None {}; struct Err { std::string msg; }; template struct Result { std::variant val; Result(Result& other) = default; Result(const Err& e) : val(std::in_place_type, e) {} Result(Err&& e) : val(std::in_place_type, std::move(e)) {} template Result(U&& u) : val(std::in_place_type, std::forward(u)) {} Err* getErr() { return std::get_if(&val); } T& operator*() { return *std::get_if(&val); } T* operator->() { return std::get_if(&val); } }; template struct MaybeResult { std::variant val; MaybeResult() : val(None{}) {} MaybeResult(MaybeResult& other) = default; MaybeResult(const Err& e) : val(std::in_place_type, e) {} MaybeResult(Err&& e) : val(std::in_place_type, std::move(e)) {} template MaybeResult(U&& u) : val(std::in_place_type, std::forward(u)) {} // Whether we have an error or a value. Useful for assignment in loops and if // conditions where errors should not get lost. operator bool() const { return !std::holds_alternative(val); } Err* getErr() { return std::get_if(&val); } T& operator*() { return *std::get_if(&val); } T* operator->() { return std::get_if(&val); } T* getPtr() { return std::get_if(&val); } }; // Parse a single WAT module. Result<> parseModule(Module& wasm, std::string_view in); } // namespace wasm::WATParser #endif // wasm_wat_parser.h