github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fs/metadata_mapper_code.go (about) 1 //go:build ignore 2 3 // A simple metadata mapper for testing purposes 4 package main 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "log" 10 "os" 11 ) 12 13 func check[T comparable](in map[string]any, key string, want T) { 14 value, ok := in[key] 15 if !ok { 16 fmt.Fprintf(os.Stderr, "%s key not found\n", key) 17 os.Exit(1) 18 } 19 if value.(T) != want { 20 fmt.Fprintf(os.Stderr, "%s wrong - expecting %s but got %s\n", key, want, value) 21 os.Exit(1) 22 } 23 } 24 25 func main() { 26 // Read the input 27 var in map[string]any 28 err := json.NewDecoder(os.Stdin).Decode(&in) 29 if err != nil { 30 log.Fatal(err) 31 } 32 33 // Check the input 34 metadata, ok := in["Metadata"] 35 if !ok { 36 fmt.Fprintf(os.Stderr, "Metadata key not found\n") 37 os.Exit(1) 38 } 39 check(in, "Size", 5.0) 40 check(in, "SrcFs", "memory:") 41 check(in, "SrcFsType", "object.memoryFs") 42 check(in, "DstFs", "dstFs:dstFsRoot") 43 check(in, "DstFsType", "mockfs") 44 check(in, "Remote", "file.txt") 45 check(in, "MimeType", "text/plain; charset=utf-8") 46 check(in, "ModTime", "2001-02-03T04:05:06.000000007Z") 47 check(in, "IsDir", false) 48 //check(in, "ID", "Potato") 49 50 // Map the metadata 51 metadataOut := map[string]string{} 52 var out = map[string]any{ 53 "Metadata": metadataOut, 54 } 55 for k, v := range metadata.(map[string]any) { 56 switch k { 57 case "error": 58 fmt.Fprintf(os.Stderr, "Error: %s\n", v) 59 os.Exit(1) 60 case "key1": 61 v = "two " + v.(string) 62 case "key3": 63 continue 64 } 65 metadataOut[k] = v.(string) 66 } 67 metadataOut["key0"] = "cabbage" 68 69 // Write the output 70 json.NewEncoder(os.Stdout).Encode(&out) 71 if err != nil { 72 log.Fatal(err) 73 } 74 }