Begin supporting run
I'd like to be able to just call `run file.py` and have a program DWIM. I'm working on run as a step in this direction. Define a simple configuration that maps file extensions to template strings where "$file" is replaced with the argv[1]. It basically works but there are outstanding TODOs. See the README and source code for more information.
This commit is contained in:
parent
a50153c141
commit
3afb56a5e5
5 changed files with 104 additions and 0 deletions
2
run/.envrc
Normal file
2
run/.envrc
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
source_up
|
||||||
|
eval "$(lorri direnv)"
|
30
run/README.md
Normal file
30
run/README.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# run
|
||||||
|
|
||||||
|
Simplify the commands you call to run scripts on the command line.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
> run path/to/file.py
|
||||||
|
> run path/to/file.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
## How?
|
||||||
|
|
||||||
|
Define a run.json configuration mapping commands to filename extensions like
|
||||||
|
so:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
".ts": "npx ts-node $file",
|
||||||
|
".py": "python3 $file"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then call `run path/to/some/file.ts` on the command line, and `npx ts-node
|
||||||
|
file.ts` will run.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Install `run` using Nix.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
> nix-env -iA briefcase.run
|
||||||
|
```
|
16
run/default.nix
Normal file
16
run/default.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
pkgs ? import <nixpkgs> {},
|
||||||
|
depot ? import <depot> {},
|
||||||
|
briefcase ? import <briefcase> {},
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
depot.buildGo.program {
|
||||||
|
name = "run";
|
||||||
|
srcs = [
|
||||||
|
./main.go
|
||||||
|
];
|
||||||
|
deps = with briefcase.gopkgs; [
|
||||||
|
utils
|
||||||
|
];
|
||||||
|
}
|
49
run/main.go
Normal file
49
run/main.go
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if len(os.Args) != 2 {
|
||||||
|
log.Fatal("You can only call run with a single file at a time.")
|
||||||
|
}
|
||||||
|
|
||||||
|
rulesPath := utils.Resolve("run.json", []string{"/home/wpcarro/.config/run/run.json"})
|
||||||
|
b, err := ioutil.ReadFile(rulesPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Could not locate a run.json file: ", err)
|
||||||
|
}
|
||||||
|
rules := map[string]string{}
|
||||||
|
err = json.Unmarshal(b, &rules)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Could not decode run.json as JSON: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName := os.Args[1]
|
||||||
|
ext := filepath.Ext(fileName)
|
||||||
|
cmd, ok := rules[ext]
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
log.Fatalf("No rules for extension, %s, have been defined.", ext)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(wpcarro): Support more sophisticated parsing than just string
|
||||||
|
// splitting. To handle 'cases like this'.
|
||||||
|
tokens := strings.Split(strings.Replace(cmd, "$file", fileName, 1), " ")
|
||||||
|
c := exec.Command(tokens[0], tokens[1:]...)
|
||||||
|
err = c.Start()
|
||||||
|
// TODO(wpcarro): Forward STDERR and STDOUT.
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(c.Wait())
|
||||||
|
}
|
7
run/shell.nix
Normal file
7
run/shell.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ pkgs ? import <nixpkgs> {}, ... }:
|
||||||
|
|
||||||
|
pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
go
|
||||||
|
];
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue