Commit efb2051b authored by Max Kellermann's avatar Max Kellermann

SongFilter: add ToExpression()

parent a2b24cb5
...@@ -73,6 +73,27 @@ SongFilter::Item::Item(unsigned _tag, ...@@ -73,6 +73,27 @@ SongFilter::Item::Item(unsigned _tag,
{ {
} }
std::string
SongFilter::Item::ToExpression() const noexcept
{
switch (tag) {
case LOCATE_TAG_FILE_TYPE:
return "(" LOCATE_TAG_FILE_KEY " == \"" + value + "\")";
case LOCATE_TAG_BASE_TYPE:
return "(base \"" + value + "\")";
case LOCATE_TAG_MODIFIED_SINCE:
return "(modified-since \"" + value + "\")";
case LOCATE_TAG_ANY_TYPE:
return "(" LOCATE_TAG_ANY_KEY " == \"" + value + "\")";
default:
return std::string("(") + tag_item_names[tag] + " == \"" + value + "\")";
}
}
bool bool
SongFilter::Item::StringMatchNN(const char *s) const noexcept SongFilter::Item::StringMatchNN(const char *s) const noexcept
{ {
...@@ -177,6 +198,27 @@ SongFilter::~SongFilter() ...@@ -177,6 +198,27 @@ SongFilter::~SongFilter()
/* this destructor exists here just so it won't get inlined */ /* this destructor exists here just so it won't get inlined */
} }
std::string
SongFilter::ToExpression() const noexcept
{
auto i = items.begin();
const auto end = items.end();
if (std::next(i) == end)
return i->ToExpression();
std::string e("(");
e += i->ToExpression();
for (++i; i != end; ++i) {
e += " AND ";
e += i->ToExpression();
}
e.push_back(')');
return e;
}
static std::chrono::system_clock::time_point static std::chrono::system_clock::time_point
ParseTimeStamp(const char *s) ParseTimeStamp(const char *s)
{ {
......
...@@ -70,6 +70,12 @@ public: ...@@ -70,6 +70,12 @@ public:
Item(unsigned tag, std::string &&_value, bool fold_case=false); Item(unsigned tag, std::string &&_value, bool fold_case=false);
Item(unsigned tag, std::chrono::system_clock::time_point time); Item(unsigned tag, std::chrono::system_clock::time_point time);
/**
* Convert this object into an "expression". This is
* only useful for debugging.
*/
std::string ToExpression() const noexcept;
unsigned GetTag() const { unsigned GetTag() const {
return tag; return tag;
} }
...@@ -129,6 +135,12 @@ public: ...@@ -129,6 +135,12 @@ public:
~SongFilter(); ~SongFilter();
/**
* Convert this object into an "expression". This is
* only useful for debugging.
*/
std::string ToExpression() const noexcept;
private: private:
gcc_nonnull(2,3) gcc_nonnull(2,3)
void Parse(const char *tag, const char *value, bool fold_case=false); void Parse(const char *tag, const char *value, bool fold_case=false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment