From 6cb906ab5fbdf34d9cb1e1cbf086050b1f29812f Mon Sep 17 00:00:00 2001
From: Leonard Lyubich <leonard@nspcc.ru>
Date: Thu, 11 Feb 2021 01:07:48 +0300
Subject: [PATCH] [#362] cli/object: Support JSON input of search filter

Consider single word of search filter expression as path to file with
protobuf JSON filters. Decode filters from file and add them to the rest.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
---
 cmd/neofs-cli/modules/object.go | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/cmd/neofs-cli/modules/object.go b/cmd/neofs-cli/modules/object.go
index c13529710..e3d3442a4 100644
--- a/cmd/neofs-cli/modules/object.go
+++ b/cmd/neofs-cli/modules/object.go
@@ -141,7 +141,7 @@ func init() {
 	objectSearchCmd.Flags().String("cid", "", "Container ID")
 	_ = objectSearchCmd.MarkFlagRequired("cid")
 	objectSearchCmd.Flags().StringSliceVarP(&searchFilters, "filters", "f", nil,
-		"Repeated filter expressions")
+		"Repeated filter expressions or files with protobuf JSON")
 	objectSearchCmd.Flags().Bool("root", false, "Search for user objects")
 	objectSearchCmd.Flags().Bool("phy", false, "Search physically stored objects")
 	objectSearchCmd.Flags().String(searchOIDFlag, "", "Search object by identifier")
@@ -541,6 +541,19 @@ func parseSearchFilters(cmd *cobra.Command) (object.SearchFilters, error) {
 		switch len(words) {
 		default:
 			return nil, fmt.Errorf("invalid field number: %d", len(words))
+		case 1:
+			data, err := ioutil.ReadFile(words[0])
+			if err != nil {
+				return nil, err
+			}
+
+			subFs := object.NewSearchFilters()
+
+			if err := subFs.UnmarshalJSON(data); err != nil {
+				return nil, err
+			}
+
+			fs = append(fs, subFs...)
 		case 2:
 			m, ok := searchUnaryOpVocabulary[words[1]]
 			if !ok {