Proposing consistent naming for stream position concepts in xs.
Current naming mixes metaphors:
.headreturns the newest frame (like Git HEAD)--tailskips to the end (like Unix tail)- But
resume_from: "head"means start from the beginning
Exploring schema validation for nushell/http-nu
We want to validate records against a schema (like JSON Schema). Nushell already has type syntax for command signatures:
def foo []: record<
name: string,
age: int,
email?: string,
tags: list<string>,| use xs.nu * | |
| use http-nu/router * | |
| use http-nu/datastar * | |
| use http-nu/html * | |
| def escape []: string -> string { | |
| $in | str replace -a '&' '&' | str replace -a '<' '<' | str replace -a '>' '>' | |
| } |
| use /root/.config/nushell/scripts/xs.nu * | |
| def decode-basic-auth [header?: string] { | |
| if ($header | is-empty) or (not ($header | str starts-with 'Basic ')) { | |
| return null | |
| } | |
| let encoded_part = $header | str replace 'Basic ' '' | |
| # handle base64 decode errors |
| Analysis Complete | |
| I've reviewed the http-nu repository and found the key insights for fixing the Darwin build failure in nixpkgs. | |
| Root Cause | |
| The libproc v0.14.11 crate (a transitive dependency via nu-system → part of Nushell) uses bindgen to generate Rust bindings from C code. Bindgen requires libclang to compile, but the current nixpkgs package | |
| definition doesn't provide it for Darwin builds. | |
| How http-nu Successfully Builds on Darwin |
| export const XS_CONTEXT_SYSTEM = "0000000000000000000000000" | |
| def and-then [next: closure --else: closure] { | |
| if ($in | is-not-empty) { do $next } else { | |
| if $else != null { do $else } | |
| } | |
| } | |
| def or-else [or_else: closure] { | |
| if ($in | is-not-empty) { $in } else { do $or_else } |
| event: datastar-patch-elements | |
| data: elements <section id="todomvc" data-on-load="@get('/examples/todomvc/updates')"><header id="todo-header"><input type="checkbox" data-on-click__prevent="@post('/examples/todomvc/-1/toggle')" data-on-load="el.checked = false"> <input id="new-todo" type="text" placeholder="What needs to be done?" data-signals-input data-bind-input data-on-keydown=" | |
| data: elements evt.key === 'Enter' && $input.trim() && @patch('/examples/todomvc/-1') && ($input = ''); | |
| data: elements "></header><ul id="todo-list"><li role="button" tabindex="0" data-on-dblclick="evt.target === el && @get('/examples/todomvc/0')"><input id="todo-checkbox-0" type="checkbox" data-on-load="el.checked = true" data-on-click__prevent="@post('/examples/todomvc/0/toggle')"> <label for="todo-checkbox-0">Learn any backend language</label> <button class="error small" data-on-click="@delete('/examples/todomvc/0')"><iconify-icon icon="pixelarticons:close" noobserver=""></iconify-icon> |
| <!doctype html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> | |
| <title>reveal.js</title> | |
| <link rel="stylesheet" href="dist/reset.css"> | |
| <link rel="stylesheet" href="dist/reveal.css"> |
| keybinds clear-defaults=true { | |
| locked { | |
| bind "Ctrl g" { SwitchToMode "normal"; } | |
| bind "Ctrl o" { SwitchToMode "pane"; ToggleFocusFullscreen; SwitchToMode "locked"; } | |
| bind "Ctrl t" { SwitchToMode "tab"; } | |
| } | |
| pane { | |
| bind "left" { MoveFocus "left"; } | |
| bind "down" { MoveFocus "down"; } | |
| bind "up" { MoveFocus "up"; } |
| use std-rfc/kv * | |
| alias ept = each {|x| print ($x | table -e) } | |
| $env.config.edit_mode = 'vi' | |
| $env.config.table.header_on_separator = true | |
| $env.config.table.trim = { | |
| methodology: "truncating" | |
| truncating_suffix: "..." |