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  }