github.com/argoproj/argo-events@v1.9.1/eventsources/common/fsevent/fileevent.go (about) 1 package fsevent 2 3 import ( 4 "bytes" 5 "fmt" 6 "strings" 7 ) 8 9 // Event represents a single file system notification. 10 type Event struct { 11 // Relative path to the file or directory. 12 Name string `json:"name"` 13 // File operation that triggered the event. 14 Op Op `json:"op"` 15 // User metadata 16 Metadata map[string]string `json:"metadata"` 17 } 18 19 // Op describes a set of file operations. 20 type Op uint32 21 22 // These are the generalized file operations that can trigger a notification. 23 const ( 24 Create Op = 1 << iota 25 Write 26 Remove 27 Rename 28 Chmod 29 ) 30 31 func (op Op) String() string { 32 // Use a buffer for efficient string concatenation 33 var buffer bytes.Buffer 34 35 if op&Create == Create { 36 buffer.WriteString("|CREATE") 37 } 38 if op&Remove == Remove { 39 buffer.WriteString("|REMOVE") 40 } 41 if op&Write == Write { 42 buffer.WriteString("|WRITE") 43 } 44 if op&Rename == Rename { 45 buffer.WriteString("|RENAME") 46 } 47 if op&Chmod == Chmod { 48 buffer.WriteString("|CHMOD") 49 } 50 if buffer.Len() == 0 { 51 return "" 52 } 53 return buffer.String()[1:] // Strip leading pipe 54 } 55 56 // NewOp converts a given string to Op 57 func NewOp(s string) Op { 58 var op Op 59 for _, ss := range strings.Split(s, "|") { 60 switch ss { 61 case "CREATE": 62 op |= Create 63 case "REMOVE": 64 op |= Remove 65 case "WRITE": 66 op |= Write 67 case "RENAME": 68 op |= Rename 69 case "CHMOD": 70 op |= Chmod 71 } 72 } 73 return op 74 } 75 76 // String returns a string representation of the event in the form 77 // "file: REMOVE|WRITE|..." 78 func (e Event) String() string { 79 return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) 80 }