surrealdb_expr/val/value/
generate.rs1use anyhow::Result;
2use surrealdb_types::ToSql;
3
4use crate::expr::Error;
5use crate::val::{RecordId, RecordIdKey, TableName, Value};
6
7impl Value {
8 pub fn generate(self, tb: TableName, retable: bool) -> Result<RecordId> {
9 match self {
10 Value::Number(id) if id.is_float() => {
15 let key = id.as_int_lossless().map(RecordIdKey::Number).ok_or_else(|| {
16 anyhow::Error::new(Error::IdInvalid {
17 value: Value::Number(id).to_sql(),
18 })
19 })?;
20 Ok(RecordId {
21 table: tb,
22 key,
23 })
24 }
25 Value::Number(id) if id.is_int() => Ok(RecordId {
27 table: tb,
28 key: RecordIdKey::Number(id.as_int()),
29 }),
30 Value::String(id) if !id.is_empty() => Ok(RecordId {
32 table: tb,
33 key: id.into(),
34 }),
35 Value::Object(id) => Ok(RecordId {
37 table: tb,
38 key: id.into(),
39 }),
40 Value::Array(id) => Ok(RecordId {
42 table: tb,
43 key: id.into(),
44 }),
45 Value::Uuid(id) => Ok(RecordId {
47 table: tb,
48 key: id.into(),
49 }),
50 Value::None => Ok(RecordId {
52 table: tb,
53 key: RecordIdKey::rand(),
54 }),
55 Value::RecordId(id) => {
57 if retable {
58 Ok(RecordId {
60 table: tb,
61 key: id.key,
62 })
63 } else {
64 if tb == id.table {
66 Ok(id)
68 } else {
69 Ok(RecordId {
71 table: tb,
72 key: id.key,
73 })
74 }
75 }
76 }
77 id => Err(anyhow::Error::new(Error::IdInvalid {
79 value: id.to_sql(),
80 })),
81 }
82 }
83}