diff options
Diffstat (limited to 'modules/codec/examples/arg_parser.cpp')
-rw-r--r-- | modules/codec/examples/arg_parser.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/modules/codec/examples/arg_parser.cpp b/modules/codec/examples/arg_parser.cpp new file mode 100644 index 0000000..569c464 --- /dev/null +++ b/modules/codec/examples/arg_parser.cpp @@ -0,0 +1,67 @@ +#include "../c++/args.hpp" + +#include <iostream> + +namespace sch { +using namespace saw::schema; + +using ExArgStruct = Struct< + Member<String, "file">, + Member<UInt64, "threads"> +>; + +using ExArgs = Args< + ExArgStruct, + Tuple<> +>; +} + +int main(int argc, char** argv){ + using namespace saw; + + data<sch::ExArgs, encode::Args> args_dat{argc, argv}; + codec<sch::ExArgs, encode::Args> args_codec; + + data<sch::ExArgs> nat_dat; + + auto eov = args_codec.decode(args_dat, nat_dat); + if(eov.is_error()){ + auto& err = eov.get_error(); + std::cerr<<"\n[Error] "<<err.get_category(); + auto err_msg = err.get_message(); + if(not err_msg.empty()){ + std::cerr<<" - "<<err_msg; + } + std::cerr<<std::endl; + return err.get_id(); + } + + std::cout<<"Success\n"; + std::cout<<"=======\n"; + std::cout<<"\nProgram: "; + auto& prog = nat_dat.template get<"program">(); + for(uint64_t i = 0; i < prog.size(); ++i){ + std::cout<<prog.at(i); + } + std::cout<<"\n"; + + auto& str_val = nat_dat.template get<"args">(); + { + std::cout<<"File: "; + auto& file_val = str_val.template get<"file">(); + for(uint64_t i = 0; i < file_val.size(); ++i){ + std::cout<<file_val.at(i); + } + std::cout<<"\n"; + } + { + std::cout<<"Threads: "; + auto& threads_val = str_val.template get<"threads">(); + std::cout<<threads_val.get(); + std::cout<<"\n"; + } + auto& tup_val = nat_dat.template get<"positionals">(); + + std::cout<<std::endl; + return 0; +} |