aboutsummaryrefslogtreecommitdiffstats
path: root/tests/commands.rs
blob: c9f9d60c234c6ed9f19fe901b0f6215368da5986 (plain) (blame)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
extern crate dirs;
extern crate notmuch;
extern crate supercow;

use std::path::Path;
use std::sync::Arc;
use std::result::Result;
use supercow::Supercow;
use notmuch::ScopedSupercow;

use notmuch::{
    Database,
    DatabaseExt,
    Query,
    QueryExt,
    Message,
    FrozenMessage,
    Error
};

#[derive(Debug)]
pub struct AtomicOperation<'d> {
    database: ScopedSupercow<'d, Database>,
}

impl<'d> AtomicOperation<'d> {
    pub fn new<D>(db: D) -> Result<Self, Error>
    where
        D: Into<ScopedSupercow<'d, Database>>,
    {
        let database = db.into();
        database.begin_atomic()?;
        Ok(AtomicOperation{
            database
        })
    }
}

impl<'d> Drop for AtomicOperation<'d> {
    fn drop(&mut self) {
        let _ = self.database.end_atomic();
    }
}

/// Add a single file to the database
pub fn add_file<'d, D, P>(db: D, filename: &P) -> Result<Message<'d, Database>, Error>
where
    D: Into<ScopedSupercow<'d, Database>>,
    P: AsRef<Path>
{
    let mut database = db.into();

    let _atomic = AtomicOperation::new(Supercow::share(&mut database)).unwrap();

    match <Database as DatabaseExt>::index_file(Supercow::share(&mut database), filename, None) {
        Ok(msg) => {

            // scoped version of freezing a message
            {
                let _fmsg = FrozenMessage::new(&msg);
                

            }
            Ok(msg)
        },
        Err(err) => {
            Err(err)
        }
    }


}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_add_file() {



    }
}



//       status = notmuch_database_index_file (notmuch, filename, indexing_cli_choices.opts, &message);
//       switch (status) {
//       /* Success. */
//       case NOTMUCH_STATUS_SUCCESS:
//           state->added_messages++;
//           notmuch_message_freeze (message);
//           if (state->synchronize_flags)
//               notmuch_message_maildir_flags_to_tags (message);
  
//           for (tag = state->new_tags; *tag != NULL; tag++) {
//               if (strcmp ("unread", *tag) != 0 ||
//                   ! notmuch_message_has_maildir_flag (message, 'S')) {
//                   notmuch_message_add_tag (message, *tag);
//               }
//           }
  
//           notmuch_message_thaw (message);
//           break;
//       /* Non-fatal issues (go on to next file). */
//       case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
//           if (state->synchronize_flags)
//               notmuch_message_maildir_flags_to_tags (message);
//           break;
//       case NOTMUCH_STATUS_FILE_NOT_EMAIL:
//           fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename);
//           break;
//       case NOTMUCH_STATUS_FILE_ERROR:
//           /* Someone renamed/removed the file between scandir and now. */
//           state->vanished_files++;
//           fprintf (stderr, "Unexpected error with file %s\n", filename);
//           (void) print_status_database ("add_file", notmuch, status);
//           break;
//       /* Fatal issues. Don't process anymore. */
//       case NOTMUCH_STATUS_READ_ONLY_DATABASE:
//       case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
//       case NOTMUCH_STATUS_OUT_OF_MEMORY:
//           (void) print_status_database ("add_file", notmuch, status);
//           goto DONE;
//       default:
//           INTERNAL_ERROR ("add_message returned unexpected value: %d", status);
//           goto DONE;
//       }
  
//       status = notmuch_database_end_atomic (notmuch);
  
//     DONE:
//       if (message)
//           notmuch_message_destroy (message);
  
//       return status;
//   }