github.com/coveo/gotemplate@v2.7.7+incompatible/template/extra_os.go (about) 1 package template 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "os/exec" 8 "os/user" 9 "time" 10 11 "github.com/coveo/gotemplate/collections" 12 "github.com/coveo/gotemplate/utils" 13 "github.com/sergi/go-diff/diffmatchpatch" 14 ) 15 16 const ( 17 osBase = "Operating systems functions" 18 ) 19 20 var osFuncs = dictionary{ 21 "diff": diff, 22 "exists": fileExists, 23 "glob": glob, 24 "group": userGroup, 25 "home": userHome, 26 "isDir": isDir, 27 "isExecutable": isExecutable, 28 "isFile": isFile, 29 "isReadable": isReadable, 30 "isWriteable": isWriteable, 31 "lastMod": lastMod, 32 "lookPath": lookPath, 33 "mode": fileMode, 34 "pwd": utils.Pwd, 35 "save": saveToFile, 36 "size": fileSize, 37 "stat": os.Stat, 38 "user": user.Current, 39 "username": username, 40 } 41 42 var osFuncsArgs = arguments{ 43 "diff": {"text1", "text2"}, 44 "exists": {"filename"}, 45 "isDir": {"filename"}, 46 "isExecutable": {"filename"}, 47 "isFile": {"filename"}, 48 "isReadable": {"filename"}, 49 "isWriteable": {"filename"}, 50 "lastMod": {"filename"}, 51 "mode": {"filename"}, 52 "save": {"filename", "object"}, 53 "size": {"filename"}, 54 } 55 56 var osFuncsAliases = aliases{ 57 "diff": {"difference"}, 58 "exists": {"fileExists", "isExist"}, 59 "glob": {"expand"}, 60 "group": {"userGroup"}, 61 "home": {"homeDir", "homeFolder"}, 62 "isDir": {"isDirectory", "isFolder"}, 63 "lastMod": {"lastModification", "lastModificationTime"}, 64 "lookPath": {"whereIs", "look", "which", "type"}, 65 "mode": {"fileMode"}, 66 "pwd": {"currentDir"}, 67 "save": {"write", "writeTo"}, 68 "size": {"fileSize"}, 69 "stat": {"fileStat"}, 70 "user": {"currentUser"}, 71 } 72 73 var osFuncsHelp = descriptions{ 74 "diff": "Returns a colored string that highlight differences between supplied texts.", 75 "exists": "Determines if a file exists or not.", 76 "glob": "Returns the expanded list of supplied arguments (expand *[]? on filename).", 77 "group": "Returns the current user group information (user.Group object).", 78 "home": "Returns the home directory of the current user.", 79 "isDir": "Determines if the file is a directory.", 80 "isExecutable": "Determines if the file is executable by the current user.", 81 "isFile": "Determines if the file is a file (i.e. not a directory).", 82 "isReadable": "Determines if the file is readable by the current user.", 83 "isWriteable": "Determines if the file is writeable by the current user.", 84 "lastMod": "Returns the last modification time of the file.", 85 "lookPath": "Returns the location of the specified executable (returns empty string if not found).", 86 "mode": "Returns the file mode.", 87 "pwd": "Returns the current working directory.", 88 "save": "Save object to file.", 89 "size": "Returns the file size.", 90 "stat": "Returns the file Stat information (os.Stat object).", 91 "user": "Returns the current user information (user.User object).", 92 "username": "Returns the current user name.", 93 } 94 95 func (t *Template) addOSFuncs() { 96 t.AddFunctions(osFuncs, osBase, FuncOptions{ 97 FuncHelp: osFuncsHelp, 98 FuncArgs: osFuncsArgs, 99 FuncAliases: osFuncsAliases, 100 }) 101 } 102 103 func fileExists(file interface{}) (bool, error) { 104 if _, err := os.Stat(fmt.Sprint(file)); err != nil { 105 if os.IsNotExist(err) { 106 err = nil 107 } 108 return false, err 109 } 110 return true, nil 111 } 112 113 func fileMode(file interface{}) (os.FileMode, error) { 114 stat, err := os.Stat(fmt.Sprint(file)) 115 if err != nil { 116 return 0, err 117 } 118 return stat.Mode(), nil 119 } 120 121 func fileSize(file interface{}) (int64, error) { 122 stat, err := os.Stat(fmt.Sprint(file)) 123 if err != nil { 124 return 0, err 125 } 126 return stat.Size(), nil 127 } 128 129 func isDir(file interface{}) (bool, error) { 130 stat, err := os.Stat(fmt.Sprint(file)) 131 if err != nil { 132 return false, err 133 } 134 return stat.IsDir(), nil 135 } 136 137 func isFile(file interface{}) (bool, error) { 138 isDir, err := isDir(file) 139 if err != nil { 140 return false, err 141 } 142 return !isDir, nil 143 } 144 145 func isReadable(file interface{}) (bool, error) { 146 stat, err := os.Stat(fmt.Sprint(file)) 147 if err != nil { 148 return false, err 149 } 150 return stat.Mode()&0400 != 0, nil 151 } 152 153 func isWriteable(file interface{}) (bool, error) { 154 stat, err := os.Stat(fmt.Sprint(file)) 155 if err != nil { 156 return false, err 157 } 158 return stat.Mode()&0200 != 0, nil 159 } 160 161 func isExecutable(file interface{}) (bool, error) { 162 stat, err := os.Stat(fmt.Sprint(file)) 163 if err != nil { 164 return false, err 165 } 166 return stat.Mode()&0100 != 0 && !stat.IsDir(), nil 167 } 168 169 func lastMod(file interface{}) (time.Time, error) { 170 stat, err := os.Stat(fmt.Sprint(file)) 171 if err != nil { 172 return time.Time{}, err 173 } 174 return stat.ModTime(), nil 175 } 176 177 func glob(args ...interface{}) collections.IGenericList { 178 return collections.AsList(utils.GlobFuncTrim(args...)) 179 } 180 181 func diff(text1, text2 interface{}) interface{} { 182 dmp := diffmatchpatch.New() 183 diffs := dmp.DiffMain(fmt.Sprint(text1), fmt.Sprint(text2), true) 184 return dmp.DiffPrettyText(diffs) 185 } 186 187 func saveToFile(filename string, object interface{}) (string, error) { 188 return "", ioutil.WriteFile(filename, []byte(fmt.Sprint(object)), 0644) 189 } 190 191 func username() string { 192 u, err := user.Current() 193 if err != nil { 194 return "" 195 } 196 return u.Username 197 } 198 199 func userGroup() (*user.Group, error) { 200 u, err := user.Current() 201 if err != nil { 202 return nil, err 203 } 204 return user.LookupGroupId(u.Gid) 205 } 206 207 func userHome() string { 208 u, err := user.Current() 209 if err != nil { 210 return os.Getenv("HOME") 211 } 212 return u.HomeDir 213 } 214 215 func lookPath(file interface{}) string { 216 path, _ := exec.LookPath(fmt.Sprint(file)) 217 return path 218 }