github.com/aneshas/cli@v0.0.0-20180104210444-aec958fa47db/langs/rust.go (about) 1 package langs 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 ) 9 10 type RustLangHelper struct { 11 BaseHelper 12 } 13 14 func (h *RustLangHelper) Handles(lang string) bool { 15 return defaultHandles(h, lang) 16 } 17 func (h *RustLangHelper) Runtime() string { 18 return h.LangStrings()[0] 19 } 20 func (lh *RustLangHelper) LangStrings() []string { 21 return []string{"rust"} 22 } 23 func (lh *RustLangHelper) Extensions() []string { 24 return []string{".rs"} 25 } 26 27 func (lh *RustLangHelper) BuildFromImage() (string, error) { 28 return "rust:1", nil 29 } 30 31 func (lh *RustLangHelper) RunFromImage() (string, error) { 32 return "debian:stretch", nil 33 } 34 35 func (lh *RustLangHelper) HasBoilerplate() bool { return true } 36 37 func cargoTomlContent(username string) string { 38 return `[package] 39 name = "func" 40 version = "0.1.0" 41 authors = ["` + username + `"] 42 43 [dependencies] 44 ` 45 } 46 47 func mainContent() string { 48 return `fn main() { 49 println!("Hello, world!"); 50 } 51 ` 52 } 53 54 func (lh *RustLangHelper) GenerateBoilerplate() error { 55 wd, err := os.Getwd() 56 if err != nil { 57 return err 58 } 59 username := os.Getenv("USER") 60 if len(username) == 0 { 61 username = "unknown" 62 } 63 64 pathToCargoToml := filepath.Join(wd, "Cargo.toml") 65 if exists(pathToCargoToml) { 66 return ErrBoilerplateExists 67 } 68 if err := ioutil.WriteFile(pathToCargoToml, []byte(cargoTomlContent(username)), os.FileMode(0644)); err != nil { 69 return err 70 } 71 if err = os.MkdirAll(filepath.Join(wd, "src"), os.FileMode(0755)); err != nil { 72 return err 73 } 74 pathToMain := filepath.Join(wd, "src", "main.rs") 75 if err := ioutil.WriteFile(pathToMain, []byte(mainContent()), os.FileMode(0644)); err != nil { 76 return err 77 } 78 79 return nil 80 } 81 82 func (lh *RustLangHelper) Entrypoint() (string, error) { 83 return "/function/func", nil 84 } 85 86 func (lh *RustLangHelper) DockerfileCopyCmds() []string { 87 return []string{ 88 "COPY --from=build-stage /function/src/target/release/func /function/func", 89 } 90 } 91 92 func (lh *RustLangHelper) DockerfileBuildCmds() []string { 93 r := []string{} 94 r = append(r, "ADD . /function/src/") 95 r = append(r, "RUN cd /function/src/ && cargo build --release") 96 return r 97 } 98 99 func (lh *RustLangHelper) HasPreBuild() bool { 100 return true 101 } 102 103 func (lh *RustLangHelper) PreBuild() error { 104 wd, err := os.Getwd() 105 if err != nil { 106 return err 107 } 108 109 if !exists(filepath.Join(wd, "Cargo.toml")) { 110 return errors.New("Could not find Cargo.toml - are you sure this is a Rust Cargo project?") 111 } 112 113 return nil 114 } 115 116 func (lh *RustLangHelper) AfterBuild() error { 117 return os.RemoveAll("target") 118 }