#!/bin/sh -eu usage() { print "%s\n\n%s\n%s\n%s\n" "$0 [-h] [-y ] [-d ]" \ '-h | --help Output this help.' \ '-y | --help Use another year than the current one.' \ '-d | --help Use another day than the current one.' } _opts=$( getopt --options "y:d:h" --long 'year:,day:,help' -- "$@" ) eval set -- "${_opts}" unset _opts while [ $1 != '--' ]; do case "$1" in '-d' | '--day') shift _day="$1" ;; '-y' | '--year') shift _year="$1" ;; '-h' | '--help') usage exit 0 ;; esac shift done _year=${_year:-$(date +%Y)} [ "${_day:-}" ] || _day=${_day:-$(TZ=EST date '+%d')} [ "${#_day}" != 1 ] || _day="0${_day}" _cargo_contents=$( sed "s/^#\(.*${_day}\)/\1/" <"${_year}/rust/Cargo.toml") echo "${_cargo_contents}" >"${_year}/rust/Cargo.toml" cd "${_year}/rust" mkdir "day${_day}" || : cd "day${_day}" cargo init --bin cat > 'Cargo.toml' << END_OF_TOML [package] name = "day${_day}" version = "0.1.0" edition = "2021" [dependencies] aoc = { path = "../../../common/rust/aoc" } anyhow = "1.0" END_OF_TOML cat > 'src/main.rs' << END_OF_SRC use { anyhow::{ anyhow, Context, Result, }, std::{ env::args, fs::File, io::{ BufRead, BufReader, }, path::Path, }, }; fn read_input>(filename: T) -> Result> { let reader = BufReader::new(File::open(filename)?); reader.lines().map( |v| { let s = v?; let n = s.parse()?; Ok(n) } ).collect() } fn part1<'a, I: IntoIterator>(_input: I) -> Result { Ok(0) } fn part2<'a, I: IntoIterator>(_input: I) -> Result { Ok(0) } fn main() -> Result<()> { let ( do_part_1, do_part_2 ) = aoc::do_parts(); let filename = args().nth(1).ok_or(anyhow!("Missing input filename"))?; let input = read_input(filename).context("Could not read input")?; if do_part_1 { let solution = part1(&input).context("No solution for part 1")?; println!("Part1, solution found to be: {}", solution); } if do_part_2 { let solution = part2(&input).context("No solution for part 2")?; println!("Part2, solution found to be: {}", solution); } Ok(()) } END_OF_SRC unset _cargo_contents _day _year