open
Open a file with a preferred handler
open
is a smart tool for reading files:
Content-Type
open
(on macOS, Linux), open-xdg
(X11), etc.open filename[.gz]|uri -> <stdout>
» open https://api.github.com/repos/lmorg/murex/issues -> foreach issue { out "$issue[number]: $issue[title]" }
Supported file extensions are listed in config
under the app and key names of shell, extensions.
Unsupported file extensions are defaulted to generic, *
.
Files with a .gz
extension are assumed to be gzipped and thus are are automatically expanded.
The Content-Type
HTTP header is compared against a list of MIME types, which are stored in config
under the app and key names of shell, mime-types.
There is a little bit of additional logic to determine the Murex data-type to use should the MIME type not appear in config
, as seen in the following code:
package lang
import (
"regexp"
"strings"
"github.com/lmorg/murex/lang/types"
)
var rxMimePrefix = regexp.MustCompile(`^([-0-9a-zA-Z]+)/.*$`)
// MimeToMurex gets the murex data type for a corresponding MIME
func MimeToMurex(mimeType string) string {
";")[0]
mime := strings.Split(mimeType,
mime = strings.TrimSpace(mime)
mime = strings.ToLower(mime)
// Find a direct match. This is only used to pick up edge cases, eg text files used as images.
dt := mimes[mime]if dt != "" {
return dt
}
// No direct match found. Fall back to prefix.
prefix := rxMimePrefix.FindStringSubmatch(mime)if len(prefix) != 2 {
return types.Generic
}
switch prefix[1] {
case "text", "i-world", "message":
return types.String
case "audio", "music", "video", "image", "model":
return types.Binary
case "application":
if strings.HasSuffix(mime, "+json") {
return types.Json
}return types.Generic
default:
// Mime type not recognized so lets just make it a generic.
return types.Generic
}
}
// MurexToMime returns the default MIME for a given Murex data type.
// The intended use case for this is for GET and POST requests where the body
// is STDIN.
func MurexToMime(dataType string) string {
return defaultMimes[dataType]
}
open
’s user agent is the same as get
and post
and is configurable via config
under they app http
» config -> [http]
{
"cookies": {
"Data-Type": "json",
"Default": {
"example.com": {
"name": "value"
},
"www.example.com": {
"name": "value"
}
},
"Description": "Defined cookies to send, ordered by domain.",
"Dynamic": false,
"Global": false,
"Value": {
"example.com": {
"name": "value"
},
"www.example.com": {
"name": "value"
}
}
},
"default-https": {
"Data-Type": "bool",
"Default": false,
"Description": "If true then when no protocol is specified (`http://` nor `https://`) then default to `https://`.",
"Dynamic": false,
"Global": false,
"Value": false
},
"headers": {
"Data-Type": "json",
"Default": {
"example.com": {
"name": "value"
},
"www.example.com": {
"name": "value"
}
},
"Description": "Defined HTTP request headers to send, ordered by domain.",
"Dynamic": false,
"Global": false,
"Value": {
"example.com": {
"name": "value"
},
"www.example.com": {
"name": "value"
}
}
},
"insecure": {
"Data-Type": "bool",
"Default": false,
"Description": "Ignore certificate errors.",
"Dynamic": false,
"Global": false,
"Value": false
},
"redirect": {
"Data-Type": "bool",
"Default": true,
"Description": "Automatically follow redirects.",
"Dynamic": false,
"Global": false,
"Value": true
},
"timeout": {
"Data-Type": "int",
"Default": 10,
"Description": "Timeout in seconds for `get` and `getfile`.",
"Dynamic": false,
"Global": false,
"Value": 10
},
"user-agent": {
"Data-Type": "str",
"Default": "murex/1.7.0000 BETA",
"Description": "User agent string for `get` and `getfile`.",
"Dynamic": false,
"Global": false,
"Value": "murex/1.7.0000 BETA"
}
}
If the open
builtin falls back to using the systems default (like open-xdg
) then the only thing that gets passed is the path being opened. If the path is stdin then a temporary file will be created. If you want to pass command line flags to open-xdg
(for example), then you need to call that command directly. In the case of macOS and some Linux systems, that might look like:
exec open --flags filename
*
(generic): generic (primitive)config
: Query or define Murex runtime settingsexec
: Runs an executablefexec
: Execute a command or function, bypassing the usual order of precedence.foreach
: Iterate through an arrayget
: Makes a standard HTTP request and returns the result as a JSON objectgetfile
: Makes a standard HTTP request and return the contents as Murex-aware data type for passing along Murex pipelines.openagent
: Creates a handler function for open
out
: Print a string to the stdout with a trailing new line characterpost
: HTTP POST request with a JSON-parsable returnThis document was generated from builtins/core/open/open_doc.yaml.
This site's content is rebuilt automatically from murex's source code after each merge to the master
branch. Downloadable murex binaries are also built with the website.
Last built on Thu Aug 15 14:38:34 UTC 2024 against commit 50ed9d650ed9d6df391240d3c2c02e623636e508dfcdad1.
Current version is 6.2.4000 which has been verified against tests cases.