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
// Copyright (c) 2023 Contributors to the Eclipse Foundation
//
// See the NOTICE file(s) distributed with this work for additional
// information regarding copyright ownership.
//
// This program and the accompanying materials are made available under the
// terms of the Apache Software License 2.0 which is available at
// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license
// which is available at https://opensource.org/licenses/MIT.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT

//! The [`CreationMode`] describes how certain posix resources should be created.

use iceoryx2_pal_posix::*;
use std::fmt::Display;

/// Describes how new resources like [`crate::file::File`], [`crate::shared_memory::SharedMemory`]
/// or others should be created.
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq, Default)]
pub enum CreationMode {
    /// Create resource, if its already existing fail.
    #[default]
    CreateExclusive,
    /// Always remove existing resource and override it with new one
    PurgeAndCreate,
    /// Either open the new resource or create it when it is not existing
    OpenOrCreate,
}

impl CreationMode {
    pub fn as_oflag(&self) -> posix::int {
        match self {
            CreationMode::PurgeAndCreate => posix::O_CREAT | posix::O_EXCL,
            CreationMode::CreateExclusive => posix::O_CREAT | posix::O_EXCL,
            CreationMode::OpenOrCreate => posix::O_CREAT,
        }
    }
}

impl Display for CreationMode {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "CreationMode: {}",
            match self {
                CreationMode::CreateExclusive => "CreateExclusive",
                CreationMode::PurgeAndCreate => "PurgeAndCreate",
                CreationMode::OpenOrCreate => "OpenOrCreate",
            }
        )
    }
}