mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
Rename to GitHub (#3)
* circle * Rename to github and fn->cli * Rename to github and fn->cli
This commit is contained in:
154
cli/funcfile.go
Normal file
154
cli/funcfile.go
Normal file
@@ -0,0 +1,154 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
yaml "gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
var (
|
||||
validfn = [...]string{
|
||||
"func.yaml",
|
||||
"func.yml",
|
||||
"func.json",
|
||||
}
|
||||
|
||||
errUnexpectedFileFormat = errors.New("unexpected file format for function file")
|
||||
)
|
||||
|
||||
type inputMap struct {
|
||||
Body interface{}
|
||||
}
|
||||
type outputMap struct {
|
||||
Body interface{}
|
||||
}
|
||||
|
||||
type fftest struct {
|
||||
Name string `yaml:"name,omitempty" json:"name,omitempty"`
|
||||
Input *inputMap `yaml:"input,omitempty" json:"input,omitempty"`
|
||||
Output *outputMap `yaml:"outoutput,omitempty" json:"output,omitempty"`
|
||||
Err *string `yaml:"err,omitempty" json:"err,omitempty"`
|
||||
Env map[string]string `yaml:"env,omitempty" json:"env,omitempty"`
|
||||
}
|
||||
|
||||
type funcfile struct {
|
||||
Name string `yaml:"name,omitempty" json:"name,omitempty"`
|
||||
Version string `yaml:"version,omitempty" json:"version,omitempty"`
|
||||
Runtime *string `yaml:"runtime,omitempty" json:"runtime,omitempty"`
|
||||
Entrypoint string `yaml:"entrypoint,omitempty" json:"entrypoint,omitempty"`
|
||||
Cmd string `yaml:"cmd,omitempty" json:"cmd,omitempty"`
|
||||
Type *string `yaml:"type,omitempty" json:"type,omitempty"`
|
||||
Memory *int64 `yaml:"memory,omitempty" json:"memory,omitempty"`
|
||||
Format *string `yaml:"format,omitempty" json:"format,omitempty"`
|
||||
Timeout *time.Duration `yaml:"timeout,omitempty" json:"timeout,omitempty"`
|
||||
Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"`
|
||||
Config map[string]string `yaml:"config,omitempty" json:"config,omitempty"`
|
||||
Build []string `yaml:"build,omitempty" json:"build,omitempty"`
|
||||
Tests []fftest `yaml:"tests,omitempty" json:"tests,omitempty"`
|
||||
Path string `yaml:"path,omitempty" json:"path,omitempty"`
|
||||
}
|
||||
|
||||
func (ff *funcfile) FullName() string {
|
||||
fname := ff.Name
|
||||
if ff.Version != "" {
|
||||
fname = fmt.Sprintf("%s:%s", fname, ff.Version)
|
||||
}
|
||||
return fname
|
||||
}
|
||||
|
||||
func (ff *funcfile) RuntimeTag() (runtime, tag string) {
|
||||
if ff.Runtime == nil {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
rt := *ff.Runtime
|
||||
tagpos := strings.Index(rt, ":")
|
||||
if tagpos == -1 {
|
||||
return rt, ""
|
||||
}
|
||||
|
||||
return rt[:tagpos], rt[tagpos+1:]
|
||||
}
|
||||
|
||||
func findFuncfile(path string) (string, error) {
|
||||
for _, fn := range validfn {
|
||||
fullfn := filepath.Join(path, fn)
|
||||
if exists(fullfn) {
|
||||
return fullfn, nil
|
||||
}
|
||||
}
|
||||
return "", newNotFoundError("could not find function file")
|
||||
}
|
||||
|
||||
func loadFuncfile() (*funcfile, error) {
|
||||
fn, err := findFuncfile(".")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return parsefuncfile(fn)
|
||||
}
|
||||
|
||||
func parsefuncfile(path string) (*funcfile, error) {
|
||||
ext := filepath.Ext(path)
|
||||
switch ext {
|
||||
case ".json":
|
||||
return decodeFuncfileJSON(path)
|
||||
case ".yaml", ".yml":
|
||||
return decodeFuncfileYAML(path)
|
||||
}
|
||||
return nil, errUnexpectedFileFormat
|
||||
}
|
||||
|
||||
func storefuncfile(path string, ff *funcfile) error {
|
||||
ext := filepath.Ext(path)
|
||||
switch ext {
|
||||
case ".json":
|
||||
return encodeFuncfileJSON(path, ff)
|
||||
case ".yaml", ".yml":
|
||||
return encodeFuncfileYAML(path, ff)
|
||||
}
|
||||
return errUnexpectedFileFormat
|
||||
}
|
||||
|
||||
func decodeFuncfileJSON(path string) (*funcfile, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not open %s for parsing. Error: %v", path, err)
|
||||
}
|
||||
ff := new(funcfile)
|
||||
err = json.NewDecoder(f).Decode(ff)
|
||||
return ff, err
|
||||
}
|
||||
|
||||
func decodeFuncfileYAML(path string) (*funcfile, error) {
|
||||
b, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not open %s for parsing. Error: %v", path, err)
|
||||
}
|
||||
ff := new(funcfile)
|
||||
err = yaml.Unmarshal(b, ff)
|
||||
return ff, err
|
||||
}
|
||||
|
||||
func encodeFuncfileJSON(path string, ff *funcfile) error {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not open %s for encoding. Error: %v", path, err)
|
||||
}
|
||||
return json.NewEncoder(f).Encode(ff)
|
||||
}
|
||||
|
||||
func encodeFuncfileYAML(path string, ff *funcfile) error {
|
||||
b, err := yaml.Marshal(ff)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not encode function file. Error: %v", err)
|
||||
}
|
||||
return ioutil.WriteFile(path, b, os.FileMode(0644))
|
||||
}
|
||||
Reference in New Issue
Block a user