upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/repos/repo.rs
blob: 0d3001fe11221d1b52aa2700f872e9343a22fe0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

use std::{path::PathBuf};

use nostr::{EventId, Event, prelude::{Nip19Event, ToBech32}, Tag};
use nostr_sdk::{Keys};

use crate::{groups::{group::{MembershipCollection, StartFinish}}, utils::load_file};

use super::init::{InitializeRepo, self};

/// [`Repo`] error
#[derive(Debug, thiserror::Error)]
pub enum Error {
    /// Error processing initialisation Repo content json - incorrect format?
    #[error("Repo cannot be initialised from content: {0}")]
    InitializeJson(#[from] init::Error),
}

/// Repo, acts a branch if root_repo is set
pub struct Repo {
    pub id: EventId,
    pub name:Option<String>,
    about:Option<String>,
    picture:Option<String>,
    pub relays:Vec<String>,
    pub maintainers_group:MembershipCollection,
    pub events:Vec<Event>,
    pub root_repo: Option<EventId>,
    hash: String, // hash of event IDs that make up this state
}

impl Repo {

    pub fn new(init:&InitializeRepo, keys:&Keys) -> Result<Self,Error> {
        let event = init.initialize(&keys);
        Repo::new_from_event(event)
    }

    pub fn open(repo_dir_path: &PathBuf) -> Self {
        Repo::new_from_json_event(
            load_file(
                repo_dir_path.join(".ngit/repo.json"),
            )
                .expect("repo.json load from file")
        )
            .expect("repo.json to produce Repo")
    }

    pub fn new_from_json_event(json_string:String) -> Result<Self,Error> {
        let event = Event::from_json(json_string)
            .expect("json_string to be formated as event");
        Repo::new_from_event(event)
    }

    pub fn new_from_event(event:Event) -> Result<Self,Error> {
        match InitializeRepo::from_json(&event.content) {
            Err(e) => return Err(Error::InitializeJson(e)),
            Ok(g) => {
                let start_finish = StartFinish { start: event.created_at, finish: None };
                // add maintainers_group
                let mut maintainers_group = MembershipCollection::new();
                match g.maintainers_group {
                    None => (),
                    Some(t) => {
                        maintainers_group.add_group_dates(
                            Tag::parse(t.into())
                                .expect("maintainers_group to parse into Tag"),
                            start_finish.clone(),
                        )
                    }
                }
                Ok(Self {
                    id: event.id,
                    name: g.name,
                    about: g.about,
                    picture: g.picture,
                    relays: g.relays,
                    maintainers_group,
                    events:vec![event],
                    root_repo:None,
                    hash: "hash".to_string(), // hash of event IDs that make up this state
                })
            }
        }        
    }

    pub fn nevent(&self) -> String {
        let e = Nip19Event {
            event_id: self.id.clone(),
            relays: if self.relays.len() > 1 {
                vec![self.relays[0].clone(),self.relays[1].clone()]
            }
            else if self.relays.len() == 1 {
                vec![self.relays[0].clone()]
            }
            else { vec![] }
        };
        e.to_bech32()
            .expect("Nip19Event to produce nevent String")
    }
}