dofigen_lib/lib.rs
1//! # dofigen_lib
2//!
3//! `dofigen_lib` help creating Dockerfile with a simplified structure and made to cache the build with Buildkit.
4//! You also can parse the structure from YAML or JSON.
5//!
6//! ```
7//! use dofigen_lib::*;
8//! use pretty_assertions_sorted::assert_eq_sorted;
9//!
10//! let mut context = DofigenContext::new();
11//!
12//! let dofigen = context.parse_from_string(r#"
13//! fromImage:
14//! path: ubuntu
15//! "#).unwrap();
16//!
17//! let dockerfile = generate_dockerfile(&dofigen).unwrap();
18//! ```
19
20#[cfg(feature = "bin")]
21pub mod bin;
22mod context;
23mod deserialize;
24mod dockerfile_struct;
25mod dofigen_struct;
26mod errors;
27mod extend;
28#[cfg(feature = "permissive")]
29mod from_str;
30mod generator;
31#[cfg(feature = "json_schema")]
32mod json_schema;
33mod linter;
34pub mod lock;
35#[cfg(feature = "parse")]
36mod parse;
37pub use {
38 context::*, deserialize::*, dockerfile_struct::*, dofigen_struct::*, errors::*, extend::*,
39 generator::GenerationContext, linter::*,
40};
41
42#[cfg(all(feature = "strict", feature = "permissive"))]
43compile_error!("You can't enable both 'strict' and 'permissive' features at the same time.");
44
45pub(crate) const DOCKERFILE_VERSION: &str = "1.19.0";
46
47const FILE_HEADER_COMMENTS: [&str; 2] = [
48 concat!(
49 "This file is generated by Dofigen v",
50 env!("CARGO_PKG_VERSION")
51 ),
52 concat!("See ", env!("CARGO_PKG_REPOSITORY")),
53];
54
55/// Generates the Dockerfile content from a Dofigen struct.
56///
57/// # Examples
58///
59/// ```
60/// use dofigen_lib::*;
61/// use pretty_assertions_sorted::assert_eq_sorted;
62///
63/// let dofigen = Dofigen {
64/// stage: Stage {
65/// from: ImageName {
66/// path: String::from("ubuntu"),
67/// ..Default::default()
68/// }.into(),
69/// ..Default::default()
70/// },
71/// ..Default::default()
72/// };
73/// let dockerfile: String = generate_dockerfile(&dofigen).unwrap();
74/// assert_eq_sorted!(
75/// dockerfile,
76/// "# syntax=docker/dockerfile:1.19.0\n# This file is generated by Dofigen v0.0.0\n# See https://github.com/lenra-io/dofigen\n\n# runtime\nFROM ubuntu AS runtime\nUSER 1000:1000\n"
77/// );
78/// ```
79#[deprecated(
80 since = "2.2.0",
81 note = "Please use `GenerationContext::generate_dockerfile` from `dofigen_lib` instead"
82)]
83pub fn generate_dockerfile(dofigen: &Dofigen) -> Result<String> {
84 GenerationContext::from(dofigen.clone()).generate_dockerfile()
85}
86
87/// Generates the .dockerignore file content from an Dofigen struct.
88///
89/// # Examples
90///
91/// ## Define the build context
92///
93/// ```
94/// use dofigen_lib::*;
95/// use pretty_assertions_sorted::assert_eq_sorted;
96///
97/// let dofigen = Dofigen {
98/// context: vec![String::from("/src")].into(),
99/// ..Default::default()
100/// };
101/// let dockerfile: String = generate_dockerignore(&dofigen);
102/// assert_eq_sorted!(
103/// dockerfile,
104/// "# This file is generated by Dofigen v0.0.0\n# See https://github.com/lenra-io/dofigen\n\n**\n!/src\n"
105/// );
106/// ```
107///
108/// ## Ignore a path
109///
110/// ```
111/// use dofigen_lib::*;
112/// use pretty_assertions_sorted::assert_eq_sorted;
113///
114/// let dofigen = Dofigen {
115/// ignore: vec![String::from("target")].into(),
116/// ..Default::default()
117/// };
118/// let dockerfile: String = generate_dockerignore(&dofigen);
119/// assert_eq_sorted!(
120/// dockerfile,
121/// "# This file is generated by Dofigen v0.0.0\n# See https://github.com/lenra-io/dofigen\n\ntarget\n"
122/// );
123/// ```
124///
125/// ## Define context ignoring a specific files
126///
127/// ```
128/// use dofigen_lib::*;
129/// use pretty_assertions_sorted::assert_eq_sorted;
130///
131/// let dofigen = Dofigen {
132/// context: vec![String::from("/src")].into(),
133/// ignore: vec![String::from("/src/*.test.rs")].into(),
134/// ..Default::default()
135/// };
136/// let dockerfile: String = generate_dockerignore(&dofigen);
137/// assert_eq_sorted!(
138/// dockerfile,
139/// "# This file is generated by Dofigen v0.0.0\n# See https://github.com/lenra-io/dofigen\n\n**\n!/src\n/src/*.test.rs\n"
140/// );
141/// ```
142#[deprecated(
143 since = "2.2.0",
144 note = "Please use `GenerationContext::generate_dockerignore` from `dofigen_lib` instead"
145)]
146pub fn generate_dockerignore(dofigen: &Dofigen) -> String {
147 GenerationContext::from(dofigen.clone())
148 .generate_dockerignore()
149 .unwrap()
150}
151
152/// Generates the effective Dofigen content from a Dofigen struct.
153///
154/// # Examples
155///
156/// ```
157/// use dofigen_lib::*;
158/// use pretty_assertions_sorted::assert_eq_sorted;
159///
160/// let dofigen = Dofigen {
161/// stage: Stage {
162/// from: ImageName {
163/// path: String::from("ubuntu"),
164/// ..Default::default()
165/// }.into(),
166/// ..Default::default()
167/// },
168/// ..Default::default()
169/// };
170/// let dofigen: String = generate_effective_content(&dofigen).unwrap();
171/// assert_eq_sorted!(
172/// dofigen,
173/// "fromImage:\n path: ubuntu\n"
174/// );
175/// ```
176pub fn generate_effective_content(dofigen: &Dofigen) -> Result<String> {
177 Ok(serde_yaml::to_string(&dofigen)?)
178}
179
180/// Generates the JSON schema for the Dofigen struct.
181/// This is useful to validate the structure and IDE autocompletion.
182#[cfg(feature = "json_schema")]
183pub fn generate_json_schema() -> String {
184 use schemars::{
185 generate::SchemaSettings,
186 transform::{AddNullable, RestrictFormats, Transform},
187 };
188
189 let settings = SchemaSettings::draft07();
190 let generator = settings.into_generator();
191 let mut schema = generator.into_root_schema_for::<Extend<DofigenPatch>>();
192 let mut nullable = AddNullable::default();
193 nullable.add_const_null = false;
194 nullable.remove_null_type = false;
195 nullable.transform(&mut schema);
196 let mut restrcit_formats = RestrictFormats::default();
197 restrcit_formats.transform(&mut schema);
198 serde_json::to_string_pretty(&schema).unwrap()
199}