Rustler v0.22.0 Release Notes

Release Date: 2019-09-07 // over 4 years ago
  • โž• Added

    • Simple Debug impl for rustler::Error
    • ๐Ÿ‘Œ Support newtype and tuple structs for NifTuple and NifRecord
    • rustler::Error::Term encoding an arbitrary boxed encoder, returning {:error, term}
    • Generic encoder/decoder for HashMap<T, U>, where T: Decoder and U: Decoder

    ๐Ÿ›  Fixed

    • Compilation time of generated decoders has been reduced significantly.
    • Fixed a segfault caused by OwnedEnv::send_and_clear

    ๐Ÿ”„ Changes

    • ๐Ÿ“‡ Renamed Pid to LocalPid to clarify that it can't point to a remote process
    • โšก๏ธ Dependencies have been updated.
    • ๐Ÿ”จ Derive macros have been refactored.
    • ๐Ÿ—„ Macros have been renamed and old ones have been deprecated:
      • rustler_export_nifs! is now rustler::init!
      • rustler_atoms! is now rustler::atoms!
      • resource_struct_init! is now rustler::resource!
    • ๐Ÿ†• New rustler::atoms! macro removed the atom prefix from the name:
    //
    // Before
    //
    rustler::rustler_atoms! {
        atom ok;
        atom error;
        atom renamed_atom = "Renamed";
    }
    
    //
    // After
    //
    rustler::atoms! {
        ok,
        error,
        renamed_atom = "Renamed",
    }
    
    • NIF functions can be initialized with a simplified syntax:
    //
    // Before
    //
    rustler::rustler_export_nifs! {
        "Elixir.Math",
        [
            ("add", 2, add)
        ],
        None
    }
    
    //
    // After
    //
    rustler::init!("Elixir.Math", [add]);
    
    • NIFs can be derived from regular functions, if the arguments implement Decoder and the return type implements Encoder:
    //
    // Before
    //
    fn add<'a>(env: Env<'a>, args: &[Term<'a>]) -> Result<Term<'a>, Error> {
        let num1: i64 = args[0].decode()?;
        let num2: i64 = args[1].decode()?;
    
        Ok((atoms::ok(), num1 + num2).encode(env))
    }
    
    //
    // After
    //
    #[rustler::nif]
    fn add(a: i64, b: i64) -> i64 {
      a + b
    }
    
    • ๐Ÿ”ง rustler::nif exposes more options to configure a NIF were the NIF is defined:
    
    #[rustler::nif(schedule = "DirtyCpu")]
    pub fn dirty_cpu() -> Atom {
        let duration = Duration::from_millis(100);
        std::thread::sleep(duration);
    
        atoms::ok()
    }
    
    #[rustler::nif(name = "my_add")]
    fn add(a: i64, b: i64) -> i64 {
      a + b
    }
    

    ๐Ÿ—„ Deprecations

    ๐Ÿšš The rustler compiler has been deprecated and will be removed with v1.0. NIFs ๐Ÿ‘€ are no longer defined in mix.exs, but are configured with use Rustler. See ๐Ÿ“š the documentation for the Rustler module. To migrate to the new ๐Ÿ”ง configuration:

    • โฌ‡๏ธ Drop :rustler from the :compilers key in your mix.exs project/0 function
    • โฌ‡๏ธ Drop :rustler_crates from project/0 and move the configurations into the use Rustler of your NIF module or application config:
      # config/dev.exs
      config :my_app, MyApp.Native,
        mode: :debug
    

    ๐Ÿ“š For more information, see the documentation.