| 235 | } |
| 236 | |
| 237 | Maybe<ParsedArgs> parseArgs(int argc, char** argv) { |
| 238 | // Skip the program name |
| 239 | Deque<String> args = Deque<String>(argv + 1, argv + argc); |
| 240 | |
| 241 | ParsedArgs parsed; |
| 242 | |
| 243 | // Parse option arguments |
| 244 | while (!args.empty()) { |
| 245 | String const& arg = args.takeFirst(); |
| 246 | if (arg == "--get" || arg == "--opt") { |
| 247 | // Retrieve values at a given path in the Json document |
| 248 | if (!parsed.command.empty() || args.empty()) |
| 249 | return {}; |
| 250 | JsonPath::PathPtr path; |
| 251 | bool children = false; |
| 252 | tie(path, children) = parseGetPath(args.takeFirst()); |
| 253 | parsed.command = GetCommand{path, arg == "--opt", children}; |
| 254 | |
| 255 | } else if (arg == "--set") { |
| 256 | // Set the value at the given path in the Json document |
| 257 | if (!parsed.command.empty() || args.size() < 2) |
| 258 | return {}; |
| 259 | JsonPath::PathPtr path = parsePath(args.takeFirst()); |
| 260 | FormattedJson value = FormattedJson::parse(args.takeFirst()); |
| 261 | parsed.command = SetCommand{path, value}; |
| 262 | |
| 263 | } else if (arg == "--add") { |
| 264 | // Add (insert) a path to a Json document |
| 265 | if (!parsed.command.empty() || args.size() < 2) |
| 266 | return {}; |
| 267 | JsonPath::PathPtr path = parsePath(args.takeFirst()); |
| 268 | FormattedJson value = FormattedJson::parse(args.takeFirst()); |
| 269 | parsed.command = AddCommand{path, value}; |
| 270 | |
| 271 | } else if (arg == "--remove") { |
| 272 | // Remove a path from a Json document |
| 273 | if (!parsed.command.empty() || args.empty()) |
| 274 | return {}; |
| 275 | parsed.command = RemoveCommand{parsePath(args.takeFirst())}; |
| 276 | |
| 277 | } else if (arg == "--edit") { |
| 278 | // Interactive bullk Json editor |
| 279 | if (!parsed.command.empty() || args.empty()) |
| 280 | return {}; |
| 281 | parsed.command = EditCommand{parsePath(args.takeFirst())}; |
| 282 | |
| 283 | } else if (arg == "--editor-image") { |
| 284 | if (args.empty()) |
| 285 | return {}; |
| 286 | parsed.options.editorImages.append(parsePath(args.takeFirst())); |
| 287 | |
| 288 | } else if (arg == "--input") { |
| 289 | // Configure the input syntax for --edit |
| 290 | if (args.empty()) |
| 291 | return {}; |
| 292 | String format = args.takeFirst(); |
| 293 | if (format == "json" || format == "generic") |
| 294 | parsed.options.editFormat = make_shared<GenericInputFormat>(); |