sqlite-err-parser 0.5.0

Deconstruct certain sqlite errors
Documentation
use rusqlite::{Connection, params};

use sqlite_err_parser::{InterpretedError, deconstruct_error};

#[test]
fn primary() {
  let conn = Connection::open_in_memory().unwrap();
  conn
    .execute(
      "CREATE TABLE agents (
  id   INTEGER PRIMARY KEY,
  name TEXT UNIQUE NOT NULL
)",
      ()
    )
    .unwrap();
  conn
    .execute(
      "INSERT INTO agents (id, name) VALUES (?, ?)",
      params![1, "frank"]
    )
    .unwrap();

  let Err(err) = conn.execute(
    "INSERT INTO agents (id, name) VALUES (?, ?)",
    params![1, "bill"]
  ) else {
    panic!("Unexpectedly not Err()");
  };
  let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
    panic!("Not treated as InterpretedError::NotUnique(); {err}");
  };
  assert_eq!(&v, &[("agents", "id")]);
}

#[test]
fn simple_name() {
  let conn = Connection::open_in_memory().unwrap();
  conn
    .execute(
      "CREATE TABLE agents (
  id   INTEGER PRIMARY KEY,
  name TEXT UNIQUE NOT NULL
)",
      ()
    )
    .unwrap();
  conn
    .execute("INSERT INTO agents (name) VALUES (?)", ["frank"])
    .unwrap();

  let Err(err) =
    conn.execute("INSERT INTO agents (name) VALUES (?)", ["frank"])
  else {
    panic!("Unexpectedly not Err()");
  };
  let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
    panic!("Not treated as InterpretedError::NotUnique(); {err}");
  };
  assert_eq!(&v, &[("agents", "name")]);
}

#[test]
fn pair() {
  let conn = Connection::open_in_memory().unwrap();
  conn
    .execute(
      "CREATE TABLE agents (
  id   INTEGER PRIMARY KEY,
  role TEXT NOT NULL,
  name TEXT NOT NULL,
  UNIQUE(role,name)
)",
      ()
    )
    .unwrap();
  conn
    .execute(
      "INSERT INTO agents (role,name) VALUES (?, ?)",
      ["janitor", "frank"]
    )
    .unwrap();

  let Err(err) = conn.execute(
    "INSERT INTO agents (role,name) VALUES (?, ?)",
    ["janitor", "frank"]
  ) else {
    panic!("Unexpectedly not Err()");
  };
  let Some(InterpretedError::NotUnique(v)) = deconstruct_error(&err) else {
    panic!("Not treated as InterpretedError::NotUnique(); {err}");
  };
  assert_eq!(&v, &[("agents", "name"), ("agents", "role")]);
}

// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :