Compare commits
No commits in common. "trunk" and "20230630" have entirely different histories.
|
@ -1 +1 @@
|
||||||
/nim.cfg
|
/.direnv
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
An [open command](https://en.wikipedia.org/wiki/Open_(process)) implementation that uses [Syndicate](http://syndicate-lang.org/) and PCRE pattern matching to open URIs.
|
An [open command](https://en.wikipedia.org/wiki/Open_(process)) implementation that uses [Syndicate](http://syndicate-lang.org/) and PCRE pattern matching to open URIs.
|
||||||
|
|
||||||
There are two utilites, `open` and `uri_runner`. The former connects to a shared Syndicate dataspace using a route at `$SYNDICATE_ROUTE` and has no other configuration. The `uri_runner` component is intended to be managed by the [Syndicate server](https://git.syndicate-lang.org/syndicate-lang/syndicate-rs) thru which it receives configuration, see [uri_runner.pr](./uri_runner.pr) as an example.
|
There are two utilites, `open` and `uri_runner`. The former connects to a shared Syndicate dataspace via a UNIX socket at `$SYNDICATE_SOCK` otherwise `$XDG_RUNTIME_DIR/dataspace` and has no other configuration. The `uri_runner` component is intended to be managed by the [Syndicate server](https://git.syndicate-lang.org/syndicate-lang/syndicate-rs) thru which it receives configuration, see [uri_runner.pr](./uri_runner.pr) as an example.
|
||||||
|
|
||||||
Matching patterns to actions is done with `action-handler` records:
|
Matching patterns to actions is done with `action-handler` records:
|
||||||
```preserves
|
```preserves
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
include ../syndicate-nim/depends.tup
|
include ../syndicate-nim/depends.tup
|
||||||
NIM_FLAGS += --path:$(TUP_CWD)/../syndicate-nim/src
|
NIM_FLAGS += --path:$(TUP_CWD)/../syndicate-nim/src
|
||||||
NIM_GROUPS += $(TUP_CWD)/<lock>
|
NIM_GROUPS += $(TUP_CWD)/../nimble/<nimsha2>
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{"depends":[{"method":"fetchzip","packages":["hashlib"],"path":"/nix/store/v03nzlpdgbfxd2zhcnkfbkq01d5kqxcl-source","rev":"84e0247555e4488594975900401baaf5bbbfb53","sha256":"1pfczsv8kl36qpv543f93d2y2vgz2acckssfap7l51s2x62m6qwx","srcDir":"","url":"https://github.com/khchen/hashlib/archive/84e0247555e4488594975900401baaf5bbbfb53.tar.gz"},{"method":"fetchzip","packages":["nimcrypto"],"path":"/nix/store/zyr8zwh7vaiycn1s4r8cxwc71f2k5l0h-source","ref":"traditional-api","rev":"602c5d20c69c76137201b5d41f788f72afb95aa8","sha256":"1dmdmgb6b9m5f8dyxk781nnd61dsk3hdxqks7idk9ncnpj9fng65","srcDir":"","url":"https://github.com/cheatfate/nimcrypto/archive/602c5d20c69c76137201b5d41f788f72afb95aa8.tar.gz"},{"method":"fetchzip","packages":["npeg"],"path":"/nix/store/ffkxmjmigfs7zhhiiqm0iw2c34smyciy-source","ref":"1.2.1","rev":"26d62fdc40feb84c6533956dc11d5ee9ea9b6c09","sha256":"0xpzifjkfp49w76qmaylan8q181bs45anmp46l4bwr3lkrr7bpwh","srcDir":"src","url":"https://github.com/zevv/npeg/archive/26d62fdc40feb84c6533956dc11d5ee9ea9b6c09.tar.gz"},{"method":"fetchzip","packages":["preserves"],"path":"/nix/store/nrcpzf9hx70kry3gwhrdzcs3qicjncjh-source","ref":"20231021","rev":"edece399be70818208bf2263c30cb2bcf435bbff","sha256":"0xmw35wmw3a4lja9q4qvlvpxv3xk0hnkjg4fwfw6f3inh6zfiqki","srcDir":"src","url":"https://git.syndicate-lang.org/ehmry/preserves-nim/archive/edece399be70818208bf2263c30cb2bcf435bbff.tar.gz"},{"method":"fetchzip","packages":["syndicate"],"path":"/nix/store/1y3nnpp2mhxqmdb3xh4c4k5k5l9hhqk3-source","ref":"20231019","rev":"57b99b20e7db1b97b1cb9c6df574bd13983c26fc","sha256":"1kgb3a78igs37xkmv8cbaxa17qdjf2h43vdmpda517c9086ggsn5","srcDir":"src","url":"https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/57b99b20e7db1b97b1cb9c6df574bd13983c26fc.tar.gz"}]}
|
|
12
shell.nix
12
shell.nix
|
@ -1,7 +1,5 @@
|
||||||
{ pkgs ? import <nixpkgs> { } }:
|
let
|
||||||
|
syndicate = builtins.getFlake "syndicate";
|
||||||
pkgs.nim2Packages.buildNimPackage {
|
pkgs =
|
||||||
name = "dummy";
|
import <nixpkgs> { overlays = builtins.attrValues syndicate.overlays; };
|
||||||
nativeBuildInputs = [ pkgs.pkg-config ];
|
in pkgs.nimPackages.xdg_open_ng
|
||||||
buildInputs = [ pkgs.pcre ];
|
|
||||||
}
|
|
||||||
|
|
20
src/open.nim
20
src/open.nim
|
@ -2,10 +2,10 @@
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
import std/[asyncdispatch, os, uri]
|
import std/[asyncdispatch, os, uri]
|
||||||
import preserves, syndicate, syndicate/relays, syndicate/capabilities
|
import preserves, syndicate, syndicate/capabilities
|
||||||
import ./protocol, ./common
|
import ./protocol, ./common
|
||||||
|
|
||||||
proc publishUri(turn: var Turn; ds: Cap) =
|
proc publishUri(turn: var Turn; ds: Ref) =
|
||||||
for arg in commandLineParams():
|
for arg in commandLineParams():
|
||||||
if fileExists(arg):
|
if fileExists(arg):
|
||||||
message(turn, ds, Open(uri: protocol.Uri(
|
message(turn, ds, Open(uri: protocol.Uri(
|
||||||
|
@ -14,12 +14,14 @@ proc publishUri(turn: var Turn; ds: Cap) =
|
||||||
message(turn, ds, initRecord("open", arg.parseUri.toPreserve))
|
message(turn, ds, initRecord("open", arg.parseUri.toPreserve))
|
||||||
stop(turn)
|
stop(turn)
|
||||||
|
|
||||||
proc main =
|
proc unixSocketPath: Unix =
|
||||||
let route = envRoute()
|
result.path = getEnv("SYNDICATE_SOCK")
|
||||||
discard bootDataspace("open") do (root: Cap; turn: var Turn):
|
if result.path == "":
|
||||||
resolve(turn, root, route, publishUri)
|
result.path = getEnv("XDG_RUNTIME_DIR", "/run/user/1000") / "dataspace"
|
||||||
|
|
||||||
for i in 0..4: poll(20)
|
discard bootDataspace("open") do (root: Ref; turn: var Turn):
|
||||||
|
let cap = mint().toPreserve(Ref)
|
||||||
|
connect(turn, unixSocketPath(), cap, publishUri)
|
||||||
|
|
||||||
|
for i in 0..4: poll(20)
|
||||||
# A hack to exit
|
# A hack to exit
|
||||||
|
|
||||||
main()
|
|
||||||
|
|
|
@ -2,29 +2,29 @@
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
import std/[re, tables, uri]
|
import std/[re, tables, uri]
|
||||||
import preserves, syndicate, syndicate/relays, syndicate/patterns
|
import preserves, syndicate, syndicate/patterns
|
||||||
import ./protocol, ./common
|
import ./protocol, ./common
|
||||||
|
|
||||||
# importing std/re doesn't actually link against PCRE
|
# importing std/re doesn't actually link against PCRE
|
||||||
{.passC: staticExec("pkg-config --cflags libpcre").}
|
{.passC: staticExec("pkg-config --cflags libpcre").}
|
||||||
{.passL: staticExec("pkg-config --libs libpcre").}
|
{.passL: staticExec("pkg-config --libs libpcre").}
|
||||||
|
|
||||||
type RegexAction = tuple[regex: Regex, entity: Cap, action: Assertion]
|
type RegexAction = tuple[regex: Regex, entity: Ref, action: Assertion]
|
||||||
|
|
||||||
proc rewrite(result: var Assertion; uri: string; regex: Regex) {.gcsafe.} =
|
proc rewrite(result: var Assertion; uri: string; regex: Regex) =
|
||||||
proc op(pr: var Assertion) {.gcsafe.} =
|
proc op(pr: var Assertion) =
|
||||||
if pr.isString:
|
if pr.isString:
|
||||||
pr.string = replacef(uri, regex, pr.string)
|
pr.string = replacef(uri, regex, pr.string)
|
||||||
apply(result, op)
|
apply(result, op)
|
||||||
|
|
||||||
runActor("main") do (root: Cap; turn: var Turn):
|
runActor("main") do (root: Ref; turn: var Turn):
|
||||||
connectStdio(turn, root)
|
connectStdio(root, turn)
|
||||||
let handlers = newTable[Handle, RegexAction]()
|
var handlers: Table[Handle, RegexAction]
|
||||||
during(turn, root, ?UriRunnerConfig) do (handlerspace: Cap, urispace: Cap):
|
during(turn, root, ?UriRunnerConfig) do (handlerspace: Ref, urispace: Ref):
|
||||||
|
|
||||||
during(turn, handlerspace, dropType(ActionHandler)) do:
|
during(turn, handlerspace, dropType(ActionHandler)) do:
|
||||||
|
|
||||||
during(turn, handlerspace, ?ActionHandler) do (pat: string; entity: Cap; act: Assertion):
|
during(turn, handlerspace, ?ActionHandler) do (pat: string; entity: Ref; act: Assertion):
|
||||||
# `duringHandle` is a symbol exposed by the `during` macro
|
# `duringHandle` is a symbol exposed by the `during` macro
|
||||||
handlers[duringHandle] = (re(pat, {reIgnoreCase, reStudy}), entity, act,)
|
handlers[duringHandle] = (re(pat, {reIgnoreCase, reStudy}), entity, act,)
|
||||||
do:
|
do:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "20231021"
|
version = "20230630"
|
||||||
author = "Emery"
|
author = "Emery"
|
||||||
description = "Syndicated open command"
|
description = "Syndicated open command"
|
||||||
license = "Unlicense"
|
license = "Unlicense"
|
||||||
|
@ -10,4 +10,4 @@ bin = @[ "open", "uri_runner"]
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|
||||||
requires "nim >= 1.6.4", "syndicate >= 20231021"
|
requires "nim >= 1.6.4", "syndicate >= 20230630"
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
<require-service <daemon uri_runner>>
|
||||||
|
|
||||||
; configure the daemon when it is built
|
; configure the daemon when it is built
|
||||||
; (this is an artifact of the author's build system)
|
; (this is an artifact of the author's build system)
|
||||||
? <built uri_runner ?path ?hash> [
|
? <built uri_runner ?path ?hash> [
|
||||||
|
|
Loading…
Reference in New Issue