Subject: CVS commit: pkgsrc/lang/gleam
From: Nikita
Date: 2023-03-02 19:53:57
Message id: 20230302185357.DAA64FA90@cvs.NetBSD.org

Log Message:
gleam: update to version 0.27.0

ChangeLog (taken from https://gleam.run/news/v0.27-hello-panic-goodbye-try/):

Gleam is a type safe and scalable language for the Erlang virtual machine and \ 
JavaScript runtimes. Today Gleam v0.27.0 has been released, let’s take a look \ 
at what’s new.
Using patterns in use expressions

The Gleam v0.25 release introduced the use expression, a feature that helps \ 
avoid “callback hell” in Gleam programs. It is quite powerful and can be \ 
used to emulate many features found in other languages such as early returns, \ 
list comprehensions, async/await, monadic do syntax, and more!

pub fn handle(req: Request) -> Response {
  // Return an error for non-post requests
  use <- when(req.method != Post, return: method_not_allowed)

  // Parse the request body or return an error
  use json <- require_json_body(req)

  // Open a database connection, closing it when we're done
  use conn <- database.with_connection

  case database.insert(conn, json) {
    Ok(record) -> created_response(record)
    Error(err) -> bad_request_response(err)
  }
}

One limitation of the use expression was that patterns could not be used with \ 
their assignments, only bare variables. This means you could not destructure a \ 
tuple or other data structure with them.

As of this release patterns are now supported in the use expression, for all \ 
your destructuring needs!

use #(first, second) <- some_tuple_function()

Don’t Panic!

This release introduces the panic keyword, a simple little keyword that causes \ 
the program to crash. Why would you want to do this?

Your program may not have sufficiently constrainted types to make invalid state \ 
unrepresentable. In this case you may want to use panic to crash the program \ 
when an invalid state is reached, which is often preferable than silently \ 
continuing or programming defensively.

Alternatively you may be embracing the Erlang philosophy of “let it crash” \ 
and choosing to use handle unexpected exceptional errors with an Erlang style \ 
supervision tree. This strategy is particularly effective when rapidly \ 
prototyping or in situations where there is no way to reasonably recover from an \ 
error, or client to show an error message to.

case this_should_never_fail() {
  Ok(value) -> continue(value)

  // Oh no! Something went horribly wrong!
  Error(_) -> panic
}

Panic is similar to the assert keyword, only it always crashes rather than \ 
conditionally. Speaking of the assert keyword…
Towards a better assert

Gleam’s assert keyword is used to ensure that data matches a given pattern, \ 
crashing the program if it does not. This is useful, but using assert for this \ 
functionality means that we can’t have an assert feature that works with \ 
boolean expressions, as is commonly found in other languages.

To remedy this the pattern matching feature has been moved to this let assert \ 
syntax. The existing assert keyword has been deprecated and will later be used \ 
for a more conventional assertion feature, to be part of a larger Gleam \ 
milestone based around improving the ergonomics of testing Gleam code.

let assert Ok(value) = this_should_never_fail()

Deprecations are annoying, and nobody likes having to fix their code, so the \ 
Gleam tooling will automatically upgrade your syntax when you run gleam format \ 
or format the code in your editor.
Moving beyond try

try expressions were introduced way back in v0.9 as a way of avoiding callback \ 
hell when working with functions that can either return a value or an error. Now \ 
that we have use expressions, the less general try expressions are redundant. We \ 
always prefer to have fewer ways to do the same thing in Gleam, and fewer things \ 
to have to learn, so try expressions are deprecated in this release.

A try expression can be replaced by a use expression with the then function from \ 
the gleam/result module. Once try is no longer a keyword the then function will \ 
be aliased to try.

// With try
try file = open_file()

// With use
use file <- then(open_file())

// After `try` is removed
use file <- try(open_file())

This is still annoying to fix by hand, so the new gleam fix command has been \ 
created to automatically upgrade your code for you.

And that’s it! There’s also lots of other small improvements and bug fixes, \ 
so check the full release notes for more details.

Thanks

Gleam is made possible by the support of all the kind people and companies who \ 
have very generously sponsored or contributed to the project. Thank you all!

If you like Gleam consider sponsoring or asking your employer to sponsor Gleam \ 
development. I work full time on Gleam and your kind sponsorship is how I pay my \ 
bills!

    Fly

Files:
RevisionActionfile
1.7modifypkgsrc/lang/gleam/Makefile
1.6modifypkgsrc/lang/gleam/cargo-depends.mk
1.7modifypkgsrc/lang/gleam/distinfo