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  }