init cli
This commit is contained in:
commit
9851b6ceda
|
@ -0,0 +1,12 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# ^ added for shellcheck and file-type detection
|
||||||
|
|
||||||
|
# Watch & reload direnv on change
|
||||||
|
watch_file devshell.toml
|
||||||
|
|
||||||
|
if [[ $(type -t use_flake) != function ]]; then
|
||||||
|
echo "ERROR: use_flake function missing."
|
||||||
|
echo "Please update direnv to v2.30.0 or later."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
use flake
|
|
@ -0,0 +1,4 @@
|
||||||
|
.direnv/
|
||||||
|
out/
|
||||||
|
elm-stuff/
|
||||||
|
node_modules/
|
|
@ -0,0 +1 @@
|
||||||
|
/nix/store/fvhmybn6prayixnc92dwnsmvzf1lywm4-pre-commit-config.json
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Tx elm
|
||||||
|
|
||||||
|
> Subbit.xyz tx builder using elm-cardano
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
This repo is using nix flakes.
|
||||||
|
|
||||||
|
The "right" way to package elm with nix is not known to the author.
|
||||||
|
|
||||||
|
- Maybe [elm2nix](https://github.com/cachix/elm2nix)
|
||||||
|
|
||||||
|
## CLi
|
||||||
|
|
||||||
|
The way elm works seems to be rather sneaky. It adds `Elm` to the global js
|
||||||
|
scope. In typical use this is then picked up by some script embedded in the page
|
||||||
|
:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var app = Elm.Main.init({ node: document.getElementById("elm"), flags : ... });
|
||||||
|
```
|
||||||
|
|
||||||
|
Instead we want to call it with node. Appending the output file with
|
||||||
|
|
||||||
|
```js
|
||||||
|
this.Elm.Cli.init({ flags: process.argv });
|
||||||
|
```
|
||||||
|
|
||||||
|
Does the job. But there must be a better way ...
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"MartinSStewart/elm-uint64": "2.0.0 <= v < 3.0.0",
|
||||||
|
"dwayne/elm-integer": "1.0.0 <= v < 2.0.0",
|
||||||
|
"dwayne/elm-natural": "1.1.1 <= v < 2.0.0",
|
||||||
|
"elm/bytes": "1.0.8 <= v < 2.0.0",
|
||||||
|
"elm/core": "1.0.5 <= v < 2.0.0",
|
||||||
|
"elm/json": "1.1.3 <= v < 2.0.0",
|
||||||
|
"elm-cardano/bech32": "1.0.0 <= v < 2.0.0",
|
||||||
|
"elm-toulouse/cbor": "4.0.1 <= v < 5.0.0",
|
||||||
|
"elmcraft/core-extra": "2.1.0 <= v < 3.0.0",
|
||||||
|
"jxxcarlson/hex": "4.0.1 <= v < 5.0.0",
|
||||||
|
"turboMaCk/any-dict": "2.6.0 <= v < 3.0.0"
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"git-dependencies": {
|
||||||
|
"direct": {
|
||||||
|
"git@github.com:elm-cardano/elm-cardano.git": "v0.2.0"
|
||||||
|
},
|
||||||
|
"indirect": {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"type": "application",
|
||||||
|
"source-directories": [
|
||||||
|
"elm-stuff/gitdeps/github.com/elm-cardano/elm-cardano.git/src",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"elm-version": "0.19.1",
|
||||||
|
"dependencies": {
|
||||||
|
"direct": {
|
||||||
|
"MartinSStewart/elm-uint64": "2.0.0",
|
||||||
|
"dwayne/elm-integer": "1.0.0",
|
||||||
|
"dwayne/elm-natural": "1.1.1",
|
||||||
|
"elm/browser": "1.0.2",
|
||||||
|
"elm/bytes": "1.0.8",
|
||||||
|
"elm/core": "1.0.5",
|
||||||
|
"elm/html": "1.0.0",
|
||||||
|
"elm/json": "1.1.3",
|
||||||
|
"elm-cardano/bech32": "1.0.0",
|
||||||
|
"elm-toulouse/cbor": "4.0.1",
|
||||||
|
"elmcraft/core-extra": "2.1.0",
|
||||||
|
"jxxcarlson/hex": "4.0.1",
|
||||||
|
"turboMaCk/any-dict": "3.0.0"
|
||||||
|
},
|
||||||
|
"indirect": {
|
||||||
|
"elm/regex": "1.0.0",
|
||||||
|
"elm/time": "1.0.0",
|
||||||
|
"elm/url": "1.0.0",
|
||||||
|
"elm/virtual-dom": "1.0.3",
|
||||||
|
"elm-toulouse/float16": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test-dependencies": {
|
||||||
|
"direct": {},
|
||||||
|
"indirect": {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,244 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"aiken": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"rust-overlay": "rust-overlay"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1739388398,
|
||||||
|
"narHash": "sha256-VwGpkkp4isiiy8GUgJEz6HZklqiKOqc3zluKMVb/UxU=",
|
||||||
|
"owner": "waalge",
|
||||||
|
"repo": "aiken",
|
||||||
|
"rev": "68d7f9ff07a6ab0e8230bb85d475acfaaa0dbca7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "waalge",
|
||||||
|
"ref": "waalge/fix-nix-build",
|
||||||
|
"repo": "aiken",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1738453229,
|
||||||
|
"narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-hooks-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1737465171,
|
||||||
|
"narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"git-hooks-nix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709087332,
|
||||||
|
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1739214665,
|
||||||
|
"narHash": "sha256-26L8VAu3/1YRxS8MHgBOyOM8xALdo6N0I04PgorE7UM=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "64e75cd44acf21c7933d61d7721e812eac1b5a0a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-lib": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1738452942,
|
||||||
|
"narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1736320768,
|
||||||
|
"narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "4bc9c909d9ac828a039f288cf872d16d38185db8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1740560979,
|
||||||
|
"narHash": "sha256-Vr3Qi346M+8CjedtbyUevIGDZW8LcA1fTG0ugPY/Hic=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5135c59491985879812717f4c9fea69604e7f26f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"aiken": "aiken",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"git-hooks-nix": "git-hooks-nix",
|
||||||
|
"nixpkgs": "nixpkgs_3",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1739327257,
|
||||||
|
"narHash": "sha256-rlGK8wxz/e50Z+PQRzuP+m03IrGkhcPGmgkBnkEZ9C8=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "e01f2c035b7b8a428c119b183f4cbc55f2eef07c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1739829690,
|
||||||
|
"narHash": "sha256-mL1szCeIsjh6Khn3nH2cYtwO5YXG6gBiTw1A30iGeDU=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "3d0579f5cc93436052d94b73925b48973a104204",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
{
|
||||||
|
description = "Subbit.xyz : Cardano's featherweight L2";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
git-hooks-nix.url = "github:cachix/git-hooks.nix";
|
||||||
|
git-hooks-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
treefmt-nix.url = "github:numtide/treefmt-nix";
|
||||||
|
treefmt-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
aiken.url = "github:waalge/aiken/waalge/fix-nix-build";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = inputs @ {flake-parts, ...}:
|
||||||
|
flake-parts.lib.mkFlake {inherit inputs;}
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
inputs.git-hooks-nix.flakeModule
|
||||||
|
inputs.treefmt-nix.flakeModule
|
||||||
|
];
|
||||||
|
systems = ["x86_64-linux" "aarch64-darwin"];
|
||||||
|
perSystem = {
|
||||||
|
config,
|
||||||
|
self',
|
||||||
|
inputs',
|
||||||
|
pkgs,
|
||||||
|
system,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
treefmt = {
|
||||||
|
projectRootFile = "flake.nix";
|
||||||
|
flakeFormatter = true;
|
||||||
|
programs = {
|
||||||
|
prettier = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
printWidth = 80;
|
||||||
|
proseWrap = "always";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
alejandra.enable = true;
|
||||||
|
elm-format.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pre-commit.settings.hooks = {
|
||||||
|
treefmt.enable = true;
|
||||||
|
aiken = {
|
||||||
|
enable = true;
|
||||||
|
name = "aiken";
|
||||||
|
description = "Run aiken's formatter on ./aik";
|
||||||
|
files = "\\.ak";
|
||||||
|
entry = "${inputs'.aiken.packages.aiken}/bin/aiken fmt ./aik";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
devShells.default = let
|
||||||
|
subbit =
|
||||||
|
pkgs.writeShellScriptBin "subbit"
|
||||||
|
''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
node out/index.js $@
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
nativeBuildInputs = [
|
||||||
|
config.treefmt.build.wrapper
|
||||||
|
];
|
||||||
|
shellHook = ''
|
||||||
|
${config.pre-commit.installationScript}
|
||||||
|
echo 1>&2 "Welcome to the development shell!"
|
||||||
|
export alias subbit="node out/index.js "
|
||||||
|
'';
|
||||||
|
packages = [
|
||||||
|
pkgs.just
|
||||||
|
inputs'.aiken.packages.aiken
|
||||||
|
pkgs.elmPackages.elm
|
||||||
|
pkgs.elmPackages.nodejs
|
||||||
|
pkgs.elmPackages.elm-language-server
|
||||||
|
pkgs.elmPackages.elm-git-install
|
||||||
|
pkgs.uglify-js
|
||||||
|
pkgs.caddy
|
||||||
|
pkgs.pnpm
|
||||||
|
pkgs.typescript-language-server
|
||||||
|
subbit
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
flake = {};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
default:
|
||||||
|
just -l
|
||||||
|
|
||||||
|
out_dir := "./out"
|
||||||
|
filename := "elm.js"
|
||||||
|
out_path := out_dir + "/" + filename
|
||||||
|
min_out_path := out_dir + "/" + filename
|
||||||
|
|
||||||
|
static_dir := "./static"
|
||||||
|
|
||||||
|
setup:
|
||||||
|
mkdir -p {{out_dir}}
|
||||||
|
cp -r {{static_dir}}/* {{out_dir}}
|
||||||
|
|
||||||
|
dev args:
|
||||||
|
just setup
|
||||||
|
elm make --optimize src/Cli.elm --output {{out_path}}
|
||||||
|
cp src/index.js {{out_dir}}
|
||||||
|
node out/index.js {{args}}
|
||||||
|
|
||||||
|
serve:
|
||||||
|
caddy file-server --listen :8888 --root {{out_dir}}
|
||||||
|
|
||||||
|
# Make main and optimize
|
||||||
|
make:
|
||||||
|
elm make src/Main.elm --output elm.js --optimize
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "tx-elm",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "out/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"packageManager": "pnpm@10.4.1",
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
lockfileVersion: "9.0"
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
importers:
|
||||||
|
.: {}
|
|
@ -0,0 +1,91 @@
|
||||||
|
port module Cli exposing (..)
|
||||||
|
|
||||||
|
import Cbor.Tag exposing (Tag(..))
|
||||||
|
import CliTools exposing (doOnCmd, mkCLi)
|
||||||
|
import Platform exposing (worker)
|
||||||
|
|
||||||
|
|
||||||
|
version : String
|
||||||
|
version =
|
||||||
|
"0.0.1"
|
||||||
|
|
||||||
|
|
||||||
|
versionMessage : String
|
||||||
|
versionMessage =
|
||||||
|
version
|
||||||
|
|
||||||
|
|
||||||
|
helpMessage : String
|
||||||
|
helpMessage =
|
||||||
|
"""
|
||||||
|
cli - a cli tool in elm
|
||||||
|
|
||||||
|
How to build a cli tool in elm
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
type alias Flags =
|
||||||
|
()
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
()
|
||||||
|
|
||||||
|
|
||||||
|
type Msg
|
||||||
|
= Args (List String)
|
||||||
|
|
||||||
|
|
||||||
|
main : Program Flags Model Msg
|
||||||
|
main =
|
||||||
|
worker
|
||||||
|
{ init = init
|
||||||
|
, update = update
|
||||||
|
, subscriptions = subscriptions
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init : Flags -> ( Model, Cmd Msg )
|
||||||
|
init _ =
|
||||||
|
( (), Cmd.none )
|
||||||
|
|
||||||
|
|
||||||
|
subscriptions : Model -> Sub Msg
|
||||||
|
subscriptions _ =
|
||||||
|
do Args
|
||||||
|
|
||||||
|
|
||||||
|
port do : (List String -> msg) -> Sub msg
|
||||||
|
|
||||||
|
|
||||||
|
port stdout : String -> Cmd msg
|
||||||
|
|
||||||
|
|
||||||
|
s : String -> ( Model, Cmd msg )
|
||||||
|
s x =
|
||||||
|
( (), stdout x )
|
||||||
|
|
||||||
|
|
||||||
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||||
|
update (Args l) model =
|
||||||
|
cli l model
|
||||||
|
|
||||||
|
|
||||||
|
cli : List String -> Model -> ( Model, Cmd Msg )
|
||||||
|
cli =
|
||||||
|
mkCLi stdout version helpMessage dos
|
||||||
|
|
||||||
|
|
||||||
|
dos : List (List String -> Model -> Maybe ( Model, Cmd Msg ))
|
||||||
|
dos =
|
||||||
|
[ doOnCmd "tx" doTx, doOnCmd "view" doView ]
|
||||||
|
|
||||||
|
|
||||||
|
doTx : List String -> Model -> ( Model, Cmd Msg )
|
||||||
|
doTx _ _ =
|
||||||
|
s "doTx is not yet implemented"
|
||||||
|
|
||||||
|
|
||||||
|
doView : List String -> Model -> ( Model, Cmd Msg )
|
||||||
|
doView _ _ =
|
||||||
|
s "doView is not yet implemented"
|
|
@ -0,0 +1,90 @@
|
||||||
|
module CliTools exposing (..)
|
||||||
|
|
||||||
|
import Basics.Extra exposing (uncurry)
|
||||||
|
import MaybeExtra exposing (..)
|
||||||
|
|
||||||
|
|
||||||
|
{-| -}
|
||||||
|
doWrapString : (String -> Cmd msg) -> (List String -> Maybe String) -> List String -> model -> Maybe ( model, Cmd msg )
|
||||||
|
doWrapString pt fn args model =
|
||||||
|
Maybe.map (\x -> ( model, pt x )) (fn args)
|
||||||
|
|
||||||
|
|
||||||
|
isHelp : List String -> Bool
|
||||||
|
isHelp l =
|
||||||
|
case l of
|
||||||
|
[] ->
|
||||||
|
True
|
||||||
|
|
||||||
|
fst :: _ ->
|
||||||
|
List.member fst [ "help", "-h", "--help" ]
|
||||||
|
|
||||||
|
|
||||||
|
justHelp : String -> List String -> Maybe String
|
||||||
|
justHelp =
|
||||||
|
justIf isHelp
|
||||||
|
|
||||||
|
|
||||||
|
doHelpWith : (String -> Cmd msg) -> String -> List String -> model -> Maybe ( model, Cmd msg )
|
||||||
|
doHelpWith pt msg args =
|
||||||
|
doWrapString pt (justHelp msg) args
|
||||||
|
|
||||||
|
|
||||||
|
isVersion : List String -> Bool
|
||||||
|
isVersion l =
|
||||||
|
case l of
|
||||||
|
[] ->
|
||||||
|
False
|
||||||
|
|
||||||
|
fst :: _ ->
|
||||||
|
List.member fst [ "version", "-v", "--version" ]
|
||||||
|
|
||||||
|
|
||||||
|
justVersionWith : String -> List String -> Maybe String
|
||||||
|
justVersionWith =
|
||||||
|
justIf isVersion
|
||||||
|
|
||||||
|
|
||||||
|
doVersionWith : (String -> Cmd msg) -> String -> List String -> model -> Maybe ( model, Cmd msg )
|
||||||
|
doVersionWith pt version args =
|
||||||
|
doWrapString pt (justVersionWith version) args
|
||||||
|
|
||||||
|
|
||||||
|
mkDefDos : (String -> Cmd msg) -> String -> String -> List (List String -> model -> Maybe ( model, Cmd msg ))
|
||||||
|
mkDefDos stdout version helpMessage =
|
||||||
|
[ doHelpWith stdout helpMessage
|
||||||
|
, doVersionWith stdout version
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
doElse : (String -> Cmd msg) -> List String -> model -> ( model, Cmd msg )
|
||||||
|
doElse pt l model =
|
||||||
|
case l of
|
||||||
|
[] ->
|
||||||
|
( model, pt "Try `help`" )
|
||||||
|
|
||||||
|
fst :: _ ->
|
||||||
|
( model, pt ("Unknown cmd : `" ++ fst ++ "`") )
|
||||||
|
|
||||||
|
|
||||||
|
doOnCmd : String -> (List String -> model -> ( model, Cmd msg )) -> List String -> model -> Maybe ( model, Cmd msg )
|
||||||
|
doOnCmd cmd doThing args model =
|
||||||
|
case args of
|
||||||
|
[] ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
fst :: rest ->
|
||||||
|
if cmd == fst then
|
||||||
|
Just (doThing rest model)
|
||||||
|
|
||||||
|
else
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
|
||||||
|
mkCLi : (String -> Cmd msg) -> String -> String -> List (List String -> model -> Maybe ( model, Cmd msg )) -> List String -> model -> ( model, Cmd msg )
|
||||||
|
mkCLi stdout version helpMessage dos =
|
||||||
|
let
|
||||||
|
defDos =
|
||||||
|
mkDefDos stdout version helpMessage
|
||||||
|
in
|
||||||
|
\args -> \model -> justFirstElse (List.map uncurry (defDos ++ dos)) (uncurry (doElse stdout)) ( args, model )
|
|
@ -0,0 +1,100 @@
|
||||||
|
module Main exposing (main)
|
||||||
|
|
||||||
|
import Browser
|
||||||
|
import Cardano.Data exposing (Data(..), toCbor)
|
||||||
|
import Cbor.Encode as CborE
|
||||||
|
import Hex.Convert as Hex
|
||||||
|
import Html exposing (Html, button, div, h1, text)
|
||||||
|
import Html.Attributes exposing (class)
|
||||||
|
import Html.Events exposing (onClick)
|
||||||
|
import Integer exposing (Integer)
|
||||||
|
import Natural
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- MAIN
|
||||||
|
|
||||||
|
|
||||||
|
main : Program () Model Msg
|
||||||
|
main =
|
||||||
|
Browser.sandbox { init = init, update = update, view = view }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- MODEL
|
||||||
|
|
||||||
|
|
||||||
|
type alias Model =
|
||||||
|
Int
|
||||||
|
|
||||||
|
|
||||||
|
init : Model
|
||||||
|
init =
|
||||||
|
0
|
||||||
|
|
||||||
|
|
||||||
|
modelToData model =
|
||||||
|
case Integer.fromInt model of
|
||||||
|
Just i ->
|
||||||
|
Int i
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
Int Integer.one
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- type Data
|
||||||
|
-- = Constr Natural (List Data)
|
||||||
|
-- | Map (List ( Data, Data ))
|
||||||
|
-- | List (List Data)
|
||||||
|
-- | Int Integer
|
||||||
|
-- | Bytes (Bytes Any)
|
||||||
|
|
||||||
|
|
||||||
|
asString : Data -> String
|
||||||
|
asString d =
|
||||||
|
case d of
|
||||||
|
Constr n _ ->
|
||||||
|
"Constr " ++ Natural.toString n
|
||||||
|
|
||||||
|
Map l ->
|
||||||
|
"Map " ++ String.fromInt (List.length l)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
"OTHER "
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- UPDATE
|
||||||
|
|
||||||
|
|
||||||
|
type Msg
|
||||||
|
= Increment
|
||||||
|
| Decrement
|
||||||
|
|
||||||
|
|
||||||
|
update : Msg -> Model -> Model
|
||||||
|
update msg model =
|
||||||
|
case msg of
|
||||||
|
Increment ->
|
||||||
|
model * model + 1
|
||||||
|
|
||||||
|
Decrement ->
|
||||||
|
model - 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- VIEW
|
||||||
|
|
||||||
|
|
||||||
|
view : Model -> Html Msg
|
||||||
|
view model =
|
||||||
|
div [ class "container" ]
|
||||||
|
[ div [ class "row" ]
|
||||||
|
[ div [ class "col-sm-8" ] [ h1 [] [ text "Title" ] ] ]
|
||||||
|
, div [ class "row" ]
|
||||||
|
[ div [ class "col-sm-2" ] [ button [ onClick Increment ] [ text "+" ] ]
|
||||||
|
, div [ class "col-sm-2" ] [ text (Hex.toString (CborE.encode (toCbor (modelToData model)))) ]
|
||||||
|
, div [ class "col-sm-2" ] [ button [ onClick Decrement ] [ text "-" ] ]
|
||||||
|
]
|
||||||
|
]
|
|
@ -0,0 +1,35 @@
|
||||||
|
module MaybeExtra exposing (justFirst, justFirstElse, justIf)
|
||||||
|
|
||||||
|
|
||||||
|
justFirst : List (a -> Maybe b) -> a -> Maybe b
|
||||||
|
justFirst l x =
|
||||||
|
case l of
|
||||||
|
[] ->
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
first :: rest ->
|
||||||
|
case first x of
|
||||||
|
Just y ->
|
||||||
|
Just y
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
justFirst rest x
|
||||||
|
|
||||||
|
|
||||||
|
justFirstElse : List (a -> Maybe b) -> (a -> b) -> a -> b
|
||||||
|
justFirstElse l def x =
|
||||||
|
case justFirst l x of
|
||||||
|
Just y ->
|
||||||
|
y
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
def x
|
||||||
|
|
||||||
|
|
||||||
|
justIf : (a -> Bool) -> b -> a -> Maybe b
|
||||||
|
justIf pred y x =
|
||||||
|
if pred x then
|
||||||
|
Just y
|
||||||
|
|
||||||
|
else
|
||||||
|
Nothing
|
|
@ -0,0 +1,10 @@
|
||||||
|
var { stdout } = require("node:process");
|
||||||
|
|
||||||
|
var Elm = require("./elm").Elm;
|
||||||
|
var app = Elm.Cli.init({});
|
||||||
|
|
||||||
|
app.ports.stdout.subscribe(function (message) {
|
||||||
|
stdout.write(message + "\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
app.ports.do.send(process.argv.slice(2));
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>My Elm Project</title>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Main</title>
|
||||||
|
<link rel="stylesheet" href="./nord-minicss.css" />
|
||||||
|
<script src="elm.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="elm"></div>
|
||||||
|
<script>
|
||||||
|
var app = Elm.Main.init({ node: document.getElementById("elm") });
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue