-
Notifications
You must be signed in to change notification settings - Fork 5
/
create_simple_packet.cpp
55 lines (49 loc) · 2.13 KB
/
create_simple_packet.cpp
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
#include <pgp-packet/packet.h>
#include <sodium.h>
#include <iostream>
int main()
{
// initialize libsodium
if (sodium_init() == -1) {
return 1;
}
// when constructing a packet we must specify the body type that
// is to be contained within the packet; the constructor for the
// packet uses the same pattern a regular std::variant uses when
// forwarding constructors. the first - unnamed - parameter sets
// the alternative to construct inside the variant, while others
// get forwarded to the constructor of the selected alternative.
//
// since a user_id packet has a constructor using an std::string
// we can construct a user_id packet like this:
pgp::packet packet{
pgp::in_place_type_t<pgp::user_id>{},
std::string{ "Anne Onymous <[email protected]>" }
};
// packets have a tag function, which returns an enum indicating
// the type of packet contained inside the body. there is a free
// function called packet_tag_description which can be used when
// debugging or otherwise creating a description of a packet.
std::cout
<< "Packet type: "
<< pgp::packet_tag_description(packet.tag())
<< std::endl;
// besides getting the packet type, using the tag() function, it
// is also possible to get to the body of the packet through the
// body() function of the packet. since this is simply a variant
// as provided by the STL, it can either be visit()'ed (whenever
// writing generic code), or an explicit std::get can be done to
// retrieve a specific type of body - which could throw an error
// if the body is of a different type than the one requested. in
// this case we are certain that the body will contain a user_id
auto &body = pgp::get<pgp::user_id>(packet.body());
// now we have access to the user_id body, which provides simple
// getters for its relevant members. in this case, it's only the
// id itself that is stored, which can be retrieved using the id
// member function.
std::cout
<< "Stored user id: "
<< body.id()
<< std::endl;
return 0;
}