cli: Have way to delete payload field in `rad id`

Allow for deleting a field by setting it to `null`.
This commit is contained in:
cloudhead 2024-05-06 13:34:23 +02:00
parent 930f9b0a7e
commit 2ca1e74707
No known key found for this signature in database
4 changed files with 104 additions and 2 deletions

View File

@ -76,7 +76,7 @@ automatically accepted and included into the identity document.
*--payload* _<id> <key> <val>_::
Update the identity by setting metadata in one of the identity payloads.
This can be used to update a repository's project name or description, for
example.
example. To delete a field from a payload, simply set it to *null*.
*--no-confirm*::
Don't ask for confirmation before creating the revision.

View File

@ -0,0 +1,71 @@
Let's add a payload field and then delete it.
```
$ rad id update --title "Add field" --description "Add a new 'web' field" --payload xyz.radicle.project web '"https://acme.example"'
✓ Identity revision a8a9fee6c4f83578ab132d375f1da0c81282bef3 created
╭───────────────────────────────────────────────────────────────────╮
│ Title Add field │
│ Revision a8a9fee6c4f83578ab132d375f1da0c81282bef3 │
│ Blob fbe268d13e60f1f3a1972e0ccd592f3cdecf08b5 │
│ Author did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi │
│ State accepted │
│ Quorum yes │
│ │
│ Add a new 'web' field │
├───────────────────────────────────────────────────────────────────┤
│ ✓ did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (you) │
╰───────────────────────────────────────────────────────────────────╯
@@ -1,13 +1,14 @@
{
"payload": {
"xyz.radicle.project": {
"defaultBranch": "master",
"description": "Radicle Heartwood Protocol & Stack",
- "name": "heartwood"
+ "name": "heartwood",
+ "web": "https://acme.example"
}
},
"delegates": [
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
],
"threshold": 1
}
```
Now let's delete it by setting it to `null`.
```
$ rad id update --title "Delete field" --description "Delete 'web'" --payload xyz.radicle.project web null
✓ Identity revision d373c35876833105f8aafed8b610660b5737cd67 created
╭───────────────────────────────────────────────────────────────────╮
│ Title Delete field │
│ Revision d373c35876833105f8aafed8b610660b5737cd67 │
│ Blob d96f425412c9f8ad5d9a9a05c9831d0728e2338d │
│ Author did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi │
│ State accepted │
│ Quorum yes │
│ │
│ Delete 'web' │
├───────────────────────────────────────────────────────────────────┤
│ ✓ did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (you) │
╰───────────────────────────────────────────────────────────────────╯
@@ -1,14 +1,13 @@
{
"payload": {
"xyz.radicle.project": {
"defaultBranch": "master",
"description": "Radicle Heartwood Protocol & Stack",
- "name": "heartwood",
- "web": "https://acme.example"
+ "name": "heartwood"
}
},
"delegates": [
"did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi"
],
"threshold": 1
}
```

View File

@ -378,7 +378,11 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
for (id, key, val) in payload {
if let Some(ref mut payload) = proposal.payload.get_mut(&id) {
if let Some(obj) = payload.as_object_mut() {
obj.insert(key, val);
if val.is_null() {
obj.remove(&key);
} else {
obj.insert(key, val);
}
} else {
anyhow::bail!("payload `{id}` is not a map");
}

View File

@ -418,6 +418,33 @@ fn rad_id_threshold() {
.unwrap();
}
#[test]
fn rad_id_update_delete_field() {
let mut environment = Environment::new();
let alice = environment.node(config::node("alice"));
let working = tempfile::tempdir().unwrap();
let working = working.path();
// Setup a test repository.
fixtures::repository(working.join("alice"));
test(
"examples/rad-init.md",
working.join("alice"),
Some(&alice.home),
[],
)
.unwrap();
test(
"examples/rad-id-update-delete-field.md",
working.join("alice"),
Some(&alice.home),
[],
)
.unwrap();
}
#[test]
fn rad_id_multi_delegate() {
let mut environment = Environment::new();