package coin.optargs;


public class Demo {
	
	
	/*
	public void exemple01({int foo, String bar}) {
		System.out.printf("exemple01(foo=%d, bar=%s)%n", foo, bar);
	}
	*/
	@OptArgsInfo(value={
		@OptArg(name="foo", type=int.class),
		@OptArg(name="bar", type=String.class),
	})
	public void exemple01(OptArgs $generated$) {
		final int foo = $generated$.retrieve("foo", int.class);
		final String bar = $generated$.retrieve("bar", String.class);
		
		System.out.printf("exemple01(foo=%d, bar=%s)%n", foo, bar);
	}
	
	
	/*
	public void exemple02({int foo=30, String bar="hi"}) {
		System.out.printf("exemple02(foo=%d, bar=%s)%n", foo, bar);
	}
	*/
	@OptArgsInfo(value={
		@OptArg(name="foo", type=int.class, optional=true),
		@OptArg(name="bar", type=String.class, optional=true),
	})
	public void exemple02(OptArgs $generated$) {
		final int foo = $generated$.retrieve("foo", int.class, 30);
		final String bar = $generated$.retrieve("bar", String.class, "hi");
		
		System.out.printf("exemple02(foo=%d, bar=%s)%n", foo, bar);
	}
	
	
	/*
	public void exemple03({int foo=30, String bar=System.getProperty("os.name")}) {
		System.out.printf("exemple03(foo=%d, bar=%s)%n", foo, bar);
	}
	*/
	@OptArgsInfo(value={
		@OptArg(name="foo", type=int.class, optional=true),
		@OptArg(name="bar", type=String.class, optional=true),
	})
	public void exemple03(OptArgs $generated$) {
		final int foo = $generated$.retrieve("foo", int.class, 30);
		final String bar = $generated$.contains("bar", String.class)
			? $generated$.retrieve("bar", String.class)
			: System.getProperty("os.name");
	
		System.out.printf("exemple03(foo=%d, bar=%s)%n", foo, bar);
	}
	
	/*
	public void exemple04({int foo=30, String bar=System.getProperty("os.name"), ...} args) {
		System.out.printf("exemple04(foo=%d, bar=%s) + %s%n", foo, bar, args);
	}
	*/
	@OptArgsInfo(acceptUnknownArgs=true, value={
		@OptArg(name="foo", type=int.class, optional=true),
		@OptArg(name="bar", type=String.class, optional=true),
	})
	public void exemple04(OptArgs args) {
		final int foo = args.retrieve("foo", int.class, 30);
		final String bar = args.contains("bar", String.class)
			? args.retrieve("bar", String.class)
			: System.getProperty("os.name");
	
		System.out.printf("exemple04(foo=%d, bar=%s) + %s%n", foo, bar, args);
	}
	
	
	public void test() {

		// exemple01(foo:10, bar:"hello");
		exemple01(OptArgs.make("foo", 10, "bar", "hello"));
		
		System.out.println();
		
		// exemple02(foo:10, bar:"hello");
		exemple02(OptArgs.make("foo", 10, "bar", "hello"));
		// exemple02(foo:10);
		exemple02(OptArgs.make("foo", 10));
		// exemple02(bar:"hello");
		exemple02(OptArgs.make("bar", "hello"));
		// exemple02();
		exemple02(OptArgs.empty());
		
		System.out.println();
		
		// exemple03(foo:10, bar:"hello");
		exemple03(OptArgs.make("foo", 10, "bar", "hello"));
		// exemple03(foo:10);
		exemple03(OptArgs.make("foo", 10));
		// exemple03(bar:"hello");
		exemple03(OptArgs.make("bar", "hello"));
		// exemple03();
		exemple03(OptArgs.empty());
		
		System.out.println();
		
		// exemple04(foo:10, bar:"hello", any=100, name="value");
		exemple04(OptArgs.make("foo", 10, "bar", "hello", "any", 100, "name", "value"));
	}
	
	public static void main(String[] args) {
		new Demo().test();
	}
}
