2023-02-21 14:43:43 +03:00
use std ::env ;
use std ::fs ;
2024-01-05 15:37:36 +03:00
use std ::path ::PathBuf ;
2024-01-03 18:29:20 +03:00
use clap ::ValueEnum ;
2023-02-21 14:43:43 +03:00
use clap_complete ::Shell ;
2024-01-10 19:59:01 +03:00
use anyhow ::Result ;
2023-02-21 14:43:43 +03:00
2023-10-20 14:04:00 +03:00
pub mod cli {
2023-11-30 12:22:15 +03:00
#![ allow(unused_macros) ]
2023-11-29 19:54:40 +03:00
include! ( " src/macros.rs " ) ;
2023-10-20 14:04:00 +03:00
include! ( " src/cli/mod.rs " ) ;
2023-02-21 14:43:43 +03:00
}
2024-01-05 15:37:36 +03:00
pub mod man {
include! ( " src/man.rs " ) ;
}
2023-02-21 14:43:43 +03:00
fn main ( ) {
println! ( " cargo:rerun-if-changed=build.rs " ) ;
// Generate subplot tests.
2023-04-15 13:04:53 +03:00
#[ cfg(feature = " subplot " ) ]
2024-01-05 15:37:36 +03:00
subplot_build ::codegen ( " sq.subplot " )
2023-02-21 14:43:43 +03:00
. expect ( " failed to generate code with Subplot " ) ;
2023-10-20 14:04:00 +03:00
let mut sq = cli ::build ( ) ;
2024-01-03 18:29:20 +03:00
generate_shell_completions ( & mut sq ) . unwrap ( ) ;
2024-01-03 18:43:31 +03:00
generate_man_pages ( & sq ) . unwrap ( ) ;
2024-01-03 18:29:20 +03:00
}
2023-02-21 14:43:43 +03:00
2024-01-05 17:57:05 +03:00
/// Variable name to control the asset out directory with.
const ASSET_OUT_DIR : & str = " ASSET_OUT_DIR " ;
2024-01-05 17:45:54 +03:00
/// Returns the directory to write the given assets to.
fn asset_out_dir ( asset : & str ) -> Result < PathBuf > {
2024-01-05 17:57:05 +03:00
println! ( " cargo:rerun-if-env-changed= {} " , ASSET_OUT_DIR ) ;
2024-01-03 18:29:20 +03:00
let outdir : PathBuf =
2024-01-05 17:57:05 +03:00
env ::var_os ( ASSET_OUT_DIR ) . unwrap_or_else (
| | env ::var_os ( " OUT_DIR " ) . expect ( " OUT_DIR not set " ) ) . into ( ) ;
if outdir . exists ( ) & & ! outdir . is_dir ( ) {
return Err (
anyhow ::anyhow! ( " {}={:?} is not a directory " ,
ASSET_OUT_DIR , outdir ) ) ;
}
2024-01-05 17:45:54 +03:00
let path = outdir . join ( asset ) ;
2024-01-03 18:29:20 +03:00
fs ::create_dir_all ( & path ) ? ;
2024-01-05 17:45:54 +03:00
Ok ( path )
}
/// Generates shell completions.
fn generate_shell_completions ( sq : & mut clap ::Command ) -> Result < ( ) > {
let path = asset_out_dir ( " shell-completions " ) ? ;
2023-02-21 14:43:43 +03:00
2024-01-03 18:29:20 +03:00
for shell in Shell ::value_variants ( ) {
clap_complete ::generate_to ( * shell , sq , " sq " , & path ) ? ;
2023-02-21 14:43:43 +03:00
} ;
2023-04-08 10:49:58 +03:00
2024-01-03 18:29:20 +03:00
println! ( " cargo:warning=shell completions written to {} " , path . display ( ) ) ;
Ok ( ( ) )
2023-02-21 14:43:43 +03:00
}
2024-01-03 18:43:31 +03:00
/// Generates man pages.
fn generate_man_pages ( sq : & clap ::Command ) -> Result < ( ) > {
2024-01-05 17:45:54 +03:00
let path = asset_out_dir ( " man-pages " ) ? ;
2023-04-08 10:49:58 +03:00
2024-01-05 15:37:36 +03:00
for man in man ::manpages ( sq ) {
std ::fs ::write ( path . join ( man . filename ( ) ) , man . troff_source ( ) ) ? ;
2023-04-08 10:49:58 +03:00
}
2024-01-03 18:43:31 +03:00
println! ( " cargo:warning=man pages written to {} " , path . display ( ) ) ;
2023-04-08 10:49:58 +03:00
Ok ( ( ) )
}