mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
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:
committed by
C Cirello
parent
3788c968eb
commit
237ab3e21b
6
examples/hello/rust/Cargo.toml
Normal file
6
examples/hello/rust/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "func"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Seif Lotfy <seif@iron.io>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
30
examples/hello/rust/README.md
Normal file
30
examples/hello/rust/README.md
Normal 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
|
||||||
|
```
|
||||||
10
examples/hello/rust/src/main.rs
Normal file
10
examples/hello/rust/src/main.rs
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ var (
|
|||||||
".js": "node",
|
".js": "node",
|
||||||
".rb": "ruby",
|
".rb": "ruby",
|
||||||
".py": "python",
|
".py": "python",
|
||||||
|
".rs": "rust",
|
||||||
}
|
}
|
||||||
|
|
||||||
fnInitRuntimes []string
|
fnInitRuntimes []string
|
||||||
|
|||||||
@@ -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
42
fn/langs/rust.go
Normal 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")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user