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  }