summaryrefslogtreecommitdiffstats
path: root/sinksh/syntax_modules/sink_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sinksh/syntax_modules/sink_list.cpp')
-rw-r--r--sinksh/syntax_modules/sink_list.cpp56
1 files changed, 27 insertions, 29 deletions
diff --git a/sinksh/syntax_modules/sink_list.cpp b/sinksh/syntax_modules/sink_list.cpp
index 8c59064..1e15dd3 100644
--- a/sinksh/syntax_modules/sink_list.cpp
+++ b/sinksh/syntax_modules/sink_list.cpp
@@ -37,6 +37,8 @@
37#include "state.h" 37#include "state.h"
38#include "syntaxtree.h" 38#include "syntaxtree.h"
39 39
40SINK_DEBUG_AREA("sinksh_list")
41
40namespace SinkList 42namespace SinkList
41{ 43{
42 44
@@ -53,50 +55,46 @@ static QByteArray compressId(bool compress, const QByteArray &id)
53 return compactId.first(); 55 return compactId.first();
54} 56}
55 57
58QByteArray baIfAvailable(const QStringList &list)
59{
60 if (list.isEmpty()) {
61 return QByteArray{};
62 }
63 return list.first().toUtf8();
64}
65
56bool list(const QStringList &args_, State &state) 66bool list(const QStringList &args_, State &state)
57{ 67{
58 if (args_.isEmpty()) { 68 if (args_.isEmpty()) {
59 state.printError(QObject::tr("Please provide at least one type to list (e.g. resource, ..")); 69 state.printError(QObject::tr("Options: $type [--resource $resource] [--compact] [--filter $property=$value] [--showall|--show $property]"));
60 return false; 70 return false;
61 } 71 }
62 72
63 auto args = args_; 73 auto options = SyntaxTree::parseOptions(args_);
64 74
65 auto type = args.takeFirst(); 75 auto type = options.positionalArguments.isEmpty() ? QString{} : options.positionalArguments.first();
66 76
67 if (!type.isEmpty() && !SinkshUtils::isValidStoreType(type)) { 77 if (type.isEmpty() || !SinkshUtils::isValidStoreType(type)) {
68 state.printError(QObject::tr("Unknown type: %1").arg(type)); 78 state.printError(QObject::tr("Unknown type: %1").arg(type));
69 return false; 79 return false;
70 } 80 }
71 81
72 Sink::Query query; 82 Sink::Query query;
73 83
74 auto filterIndex = args.indexOf("--filter"); 84 if (options.options.contains("resource")) {
75 if (filterIndex >= 0) { 85 query.resourceFilter(baIfAvailable(options.options.value("resource")));
76 args.removeAt(filterIndex);
77 for (int i = 1; i < filterIndex; i++) {
78 query.resourceFilter(args.at(i).toLatin1());
79 }
80 for (int i = filterIndex + 1; i < args.size(); i++) {
81 auto filter = args.at(i).split("=");
82 query.filter(filter.at(0).toLatin1(), QVariant::fromValue(filter.at(1)));
83 }
84
85 } 86 }
86 87 if (options.options.contains("filter")) {
87 bool compact = false; 88 for (const auto &f : options.options.value("filter")) {
88 auto compactIndex = args.indexOf("--compact"); 89 auto filter = f.split("=");
89 if (compactIndex >= 0) { 90 query.filter(filter.at(0).toLatin1(), QVariant::fromValue(Sink::ApplicationDomain::Reference{filter.at(1).toLatin1()}));
90 args.removeAt(compactIndex); 91 }
91 compact = true;
92 } 92 }
93 93 auto compact = options.options.contains("compact");
94 auto allIndex = args.indexOf("--all"); 94 if (!options.options.contains("showall")) {
95 if (allIndex >= 0) { 95 if (options.options.contains("show")) {
96 args.removeAt(allIndex); 96 auto list = options.options.value("show");
97 } else { 97 std::transform(list.constBegin(), list.constEnd(), std::back_inserter(query.requestedProperties), [] (const QString &s) { return s.toLatin1(); });
98 if (!args.isEmpty()) {
99 std::transform(args.constBegin(), args.constEnd(), std::back_inserter(query.requestedProperties), [] (const QString &s) { return s.toLatin1(); });
100 } else { 98 } else {
101 query.requestedProperties = SinkshUtils::requestedProperties(type); 99 query.requestedProperties = SinkshUtils::requestedProperties(type);
102 } 100 }
@@ -151,7 +149,7 @@ bool list(const QStringList &args_, State &state)
151 149
152Syntax::List syntax() 150Syntax::List syntax()
153{ 151{
154 Syntax list("list", QObject::tr("List all resources, or the contents of one or more resources"), &SinkList::list, Syntax::EventDriven); 152 Syntax list("list", QObject::tr("List all resources, or the contents of one or more resources."), &SinkList::list, Syntax::EventDriven);
155 list.completer = &SinkshUtils::resourceOrTypeCompleter; 153 list.completer = &SinkshUtils::resourceOrTypeCompleter;
156 return Syntax::List() << list; 154 return Syntax::List() << list;
157} 155}