beet 0.0.3

A very flexible AI behavior library for games and robotics.
Documentation
set windows-shell := ["C:/tools/cygwin/bin/sh.exe","-c"]
set dotenv-load
crates := 'beet beet_core beet_ecs beet_net'

default:
	just --list --unsorted

example example *args:
	cargo run --example {{example}} {{args}}

## common
cmd *args:
	cd /cygdrive/c/work/beet && {{args}}

build-scenes *args:
	cargo run -p beet_examples --example build_scenes {{args}}
app *args:
	cargo run --example app_full {{args}}

doc:
	just watch 'cargo doc'

serve-doc:
	cd ./target/doc/beet && forky serve

test-all *args:
	just watch 'cargo test --workspace --lib -- {{args}}'

test-core *args:
	just watch 'cargo test -p beet_core --lib -- {{args}}'

test-ecs *args:
	just watch 'cargo test -p beet_ecs --lib -- {{args}}'
# just watch 'cargo test -p beet_ecs --lib -- --nocapture {{args}}'

test-ml *args:
	just watch 'cargo test -p beet_ml --lib -- {{args}}'

test-net *args:
	just watch 'cargo test -p beet_net --lib -- {{args}}'

run crate example *args:
	cargo run -p {{crate}} --example {{example}} {{args}}

run-w crate example *args:
	just watch 'just run {{crate}} {{example}} {{args}}'

serve-web:
	just serve-wasm

book:
	cd docs && mdbook serve --port 3001

# mdbooks server is busted on wsl so I use live-server
serve-book:
	cd docs/book && live-server --no-browser

clean-repo:
	cargo clean
	rm -rf ./target
# rm -rf ./Cargo.lock

pws *args:
	just --shell powershell.exe --shell-arg -c {{args}}

#### WEB EXAMPLES #####################################################

wasm-dir:= './target/web-examples'
web-examples:= 'app_basics app_full'
# web-examples:= 'animation app_basics app_full fetch flock frozen_lake_run frozen_lake_train hello_ml hello_world seek_3d seek'

web-example-build example *args:
	mkdir -p {{wasm-dir}}/{{example}} || true
	cargo build --example {{example}} --target wasm32-unknown-unknown --release {{args}}
	wasm-bindgen \
	--out-name main \
	--out-dir {{wasm-dir}}/{{example}} \
	--target web \
	$CARGO_TARGET_DIR/wasm32-unknown-unknown/release/examples/{{example}}.wasm \
	--no-typescript \

web-example-watch example *args:
	just copy-web-assets
	just watch 'just web-example-build {{example}} {{args}}'

web-examples-build-and-deploy:
	just web-examples-build
	just web-examples-deploy

copy-web-assets:
	mkdir -p {{wasm-dir}}/assets || true
	cp -r ./assets/* {{wasm-dir}}/assets

web-examples-build:
	rm -rf {{wasm-dir}} || true
	just copy-web-assets
	for file in {{web-examples}}; do \
		just web-example-build ${file}; \
	done

web-examples-size:
	for file in {{web-examples}}; do \
		du -sh {{wasm-dir}}/${file}; \
	done

web-examples-serve:
	cd {{wasm-dir}} && forky serve --any-origin --port=3002

web-examples-deploy:
	gsutil -m -h "Cache-Control:public, max-age=1" rsync -c -d -r {{wasm-dir}} gs://beet-examples
# -m  		= parallel 
# -c 			= use checksum instead of timestamp for compare
# rsync  	=	copy 
# -d 			= delete if not in local 
# -r 			= recursive


### MISC

env:
	@echo $RUST_LOG

expand crate example *args:
	just watch 'cargo expand -p {{crate}} --example {{example}} {{args}}'

patch:
	cargo set-version --bump patch

publish crate *args:
	cargo publish -p {{crate}} --allow-dirty --no-verify {{args}}
	sleep 2

publish-all *args:
	just publish beet_ecs_macros {{args}}	|| true
	just publish beet_ecs {{args}}				|| true
	just publish beet_core {{args}}				|| true
	just publish beet_net {{args}}				|| true
	just publish beet_ml {{args}}					|| true
	just publish beet_examples {{args}}		|| true
	just publish beet {{args}}						|| true

test-wasm crate *args:
	sweet -p {{crate}} --example test_{{crate}} --interactive --watch {{args}}

watch *command:
	forky watch \
	-w '**/*.rs' \
	-i '{.git,target,html}/**' \
	-i '**/mod.rs' \
	-- {{command}}




build-wasm-release crate example *args:
	just _build-wasm release {{crate}} {{example}} --release {{args}}
build-wasm crate example *args:
	just _build-wasm debug {{crate}} {{example}} {{args}}
watch-wasm-release crate example *args:
	just _watch-wasm release {{crate}} {{example}} --release {{args}}
watch-wasm crate example *args:
	just _watch-wasm debug {{crate}} {{example}} {{args}}

_build-wasm build_config crate example *args:
	cargo build -p {{crate}} --example {{example}} --target wasm32-unknown-unknown {{args}}
	wasm-bindgen \
	--out-dir ./target/static/wasm \
	--target web \
	./target/wasm32-unknown-unknown/{{build_config}}/examples/{{example}}.wasm \
	--no-typescript \

_watch-wasm build_config crate example *args:
	just watch 'just _build-wasm {{build_config}} {{crate}} {{example}} {{args}}'

copy-wasm-assets:
	rm -rf ./target/static/assets
	mkdir -p ./target/static/assets || true
	
serve-wasm *args:
	cd ./target/static && forky serve {{args}}

# npx live-server \

# --no-browser \

# --host=0.0.0.0 \

# --watch=wasm/site_bg.wasm,wasm/simulator_bg.wasm,index.html,style.css \

watch-assets:
	just watch-web 'just copy-wasm-assets'

watch-web *command:
	forky watch \
	-w '**/*/assets/**/*' \
	-- {{command}}

### GSUTIL
push-assets:
	tar -czvf ./assets.tar.gz ./assets
	gsutil cp ./assets.tar.gz gs://beet-misc/assets.tar.gz
	gsutil cp ./assets.tar.gz gs://beet-misc/assets-backup.tar.gz
	rm ./assets.tar.gz

pull-assets:
	curl -o ./assets.tar.gz https://storage.googleapis.com/beet-misc/assets.tar.gz
	tar -xzvf ./assets.tar.gz
	rm ./assets.tar.gz

view-cors:
	gcloud storage buckets describe gs://beet-examples --format="default(cors_config)"
update-cors:
	gcloud storage buckets update gs://beet-examples --cors-file=cors.json