Inital work on Rust support (#333)

* Inital work on Rust support

* update accepted runtimes

* fn: fix rust build

* Last tweaks and README.md

* fix typo

* update comment on rust.go
This commit is contained in:
Seif Lotfy سيف لطفي
2016-11-23 23:17:13 +01:00
committed by C Cirello
parent 3788c968eb
commit 237ab3e21b
7 changed files with 92 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
[package]
name = "func"
version = "0.1.0"
authors = ["Seif Lotfy <seif@iron.io>"]
[dependencies]

View File

@@ -0,0 +1,30 @@
# Using rust with functions
The easiest way to create a iron function in rust is via ***cargo*** and ***fn***.
## Prerequisites
First create an epty rust project as follows:
```bash
cargo init --name func --bin
```
Make sure the project name is ***func*** and is of type ***bin***. Now just edit your code, once done you can create an iron function.
## Creating an IronFunction
Simply run
```bash
fn init --runtime=rust <username>/<funcname>
```
This will create the ```func.yaml``` file required by functions, which can be built by running:
```bash
fn build
```
## Testing
```bash
fn run
```

View File

@@ -0,0 +1,10 @@
use std::io;
use std::io::Read;
fn main() {
let mut buffer = String::new();
let stdin = io::stdin();
if stdin.lock().read_to_string(&mut buffer).is_ok() {
println!("Hello {}", buffer.trim());
}
}

View File

@@ -235,6 +235,7 @@ var acceptableFnRuntimes = map[string]string{
"python": "iron/python:2", "python": "iron/python:2",
"ruby": "iron/ruby", "ruby": "iron/ruby",
"scala": "iron/scala", "scala": "iron/scala",
"rust": "corey/rust-alpine",
} }
const tplDockerfile = `FROM {{ .BaseImage }} const tplDockerfile = `FROM {{ .BaseImage }}

View File

@@ -27,6 +27,7 @@ var (
".js": "node", ".js": "node",
".rb": "ruby", ".rb": "ruby",
".py": "python", ".py": "python",
".rs": "rust",
} }
fnInitRuntimes []string fnInitRuntimes []string

View File

@@ -13,6 +13,8 @@ func GetLangHelper(lang string) (LangHelper, error) {
return &RubyLangHelper{}, nil return &RubyLangHelper{}, nil
case "python": case "python":
return &PythonHelper{}, nil return &PythonHelper{}, nil
case "rust":
return &RustLangHelper{}, nil
} }
return nil, fmt.Errorf("No language helper found for %v", lang) return nil, fmt.Errorf("No language helper found for %v", lang)
} }

42
fn/langs/rust.go Normal file
View File

@@ -0,0 +1,42 @@
package langs
import (
"fmt"
"os"
"os/exec"
)
type RustLangHelper struct{}
func (lh *RustLangHelper) Entrypoint() string {
return "/function/target/release/func"
}
func (lh *RustLangHelper) HasPreBuild() bool {
return true
}
// PreBuild for rust builds the binary so the final image can be as small as possible
func (lh *RustLangHelper) PreBuild() error {
wd, err := os.Getwd()
if err != nil {
return err
}
cmd := exec.Command(
"docker", "run",
"--rm", "-v",
wd+":/app", "-w", "/app", "corey/rust-alpine",
"/bin/sh", "-c", "cargo build --release",
)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
return fmt.Errorf("error running docker build: %v", err)
}
return nil
}
func (lh *RustLangHelper) AfterBuild() error {
return os.RemoveAll("target")
}