#!/usr/bin/perl
# Dockerfile.in -> Dockerfile
# currently just resolve .include_if_exists ..
#                        .include
#                        .platform
#                        <platform>

use strict;
use warnings;
use 5.14.0;
use Cwd qw(abs_path);
use File::Basename qw(basename dirname);
use Getopt::Long;

while (<>) {
    state $platform;

    if (/^.platform\s+(\S+)\s*/) {
	$platform = $1;
	$_ = "# platform is $1\n";
	next;
    }

    if (/^(?<cmd>.include(?<try>_if_exists)?)\s+(?<file>.+?)\s*$/) {
	$_ = "# $+{cmd} from $+{file} {{\n" . join('' => do { 
	    my @yield;
	    my @files = glob abs_path(dirname($ARGV)) . "/$+{file}";
	    foreach my $file (@files) {
		push @yield, "# from $file\n";
		if (open(my $in, '<', $file)) {
		    local $/ = undef;
		    push @yield, <$in>;
		}
		else {
		    die "$file: $!\n" if not $+{try};
		}
	    }
	    @yield;
	}) . "# }}\n";
    }

    if (/<platform>/) {
	die "$0:$ARGV platform not known yet!\n"
	    if not defined $platform;
	s/<platform>/$platform/g;
    }
}
continue {
    print if defined;
}
