diff --git a/Cargo.lock b/Cargo.lock index 07065b6..02589e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,10 +2,666 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "async-trait" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" +dependencies = [ + "atty", + "bitflags", + "clap_lex", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_lex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "git2" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "jobserver" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55edcf6c0bb319052dea84732cf99db461780fd5e8d3eb46ab6ff312ab31f197" + +[[package]] +name = "libgit2-sys" +version = "0.14.0+1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] + +[[package]] +name = "libssh2-sys" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mio" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "octopush" version = "0.1.0" +dependencies = [ + "eyre", + "octopush_cli", + "tokio", +] [[package]] name = "octopush_cli" version = "0.1.0" +dependencies = [ + "clap", + "eyre", + "octopush_core", + "octopush_infra", +] + +[[package]] +name = "octopush_core" +version = "0.1.0" +dependencies = [ + "async-trait", + "eyre", + "git2", + "hex", + "rand", + "tokio", +] + +[[package]] +name = "octopush_infra" +version = "0.1.0" +dependencies = [ + "eyre", + "octopush_core", +] + +[[package]] +name = "once_cell" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03b84c3b2d099b81f0953422b4d4ad58761589d0229b5506356afca05a3670a" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/Cargo.toml b/Cargo.toml index 7a1c0a4..4b29b14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,18 @@ edition = "2021" [workspace] members = [ - "crates/octopush_cli" + "crates/octopush_cli", + "crates/octopush_infra", + "crates/octopush_core", ] [dependencies] +octopush_cli = { path = "crates/octopush_cli" } + +eyre = { workspace = true } +tokio = { workspace = true } + +[workspace.dependencies] +eyre = { version = "0.6.8" } +async-trait = "0.1.58" +tokio = { version = "1.21.2", features = ["full", "test-util"] } diff --git a/crates/octopush_cli/Cargo.toml b/crates/octopush_cli/Cargo.toml index 53d7f62..094612c 100644 --- a/crates/octopush_cli/Cargo.toml +++ b/crates/octopush_cli/Cargo.toml @@ -6,3 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +octopush_infra = { path = "../octopush_infra" } +octopush_core = { path = "../octopush_core" } + +clap = { version = "4.0.18" } + +eyre = { workspace = true } diff --git a/crates/octopush_cli/src/commands/execute.rs b/crates/octopush_cli/src/commands/execute.rs new file mode 100644 index 0000000..08e8f5b --- /dev/null +++ b/crates/octopush_cli/src/commands/execute.rs @@ -0,0 +1,33 @@ +use clap::{Arg, ArgAction, ArgMatches, Command}; +use octopush_infra::service_register::ServiceRegister; + +pub fn execute_cmd() -> Command { + Command::new("execute") + .about("execute a certain action") + .arg( + Arg::new("action") + .long("action") + .short('a') + .action(ArgAction::Set) + .help("action path to your local octopush.yaml file") + .long_help("action path to your local octopush.yaml file") + .required(true), + ) +} + +pub async fn execute_subcommand(args: &ArgMatches) -> eyre::Result<()> { + let action = args + .get_one::("action") + .ok_or(eyre::anyhow!("--action is required"))?; + + let service_register = ServiceRegister::new(); + + service_register + .git_provider + .clone_from_url("https://git.front.kjuulh.io/kjuulh/cuddle".to_string()) + .await?; + + service_register.cleanup().await?; + + Ok(()) +} diff --git a/crates/octopush_cli/src/commands/mod.rs b/crates/octopush_cli/src/commands/mod.rs new file mode 100644 index 0000000..2e8bddd --- /dev/null +++ b/crates/octopush_cli/src/commands/mod.rs @@ -0,0 +1 @@ +pub mod execute; diff --git a/crates/octopush_cli/src/lib.rs b/crates/octopush_cli/src/lib.rs index 7d12d9a..ddd11b4 100644 --- a/crates/octopush_cli/src/lib.rs +++ b/crates/octopush_cli/src/lib.rs @@ -1,14 +1,38 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right +mod commands; + +use clap::Command; + +const VERSION: &str = "1.0.0"; + +#[derive(Debug)] +pub struct OctopushCli { + cmd: clap::Command, } -#[cfg(test)] -mod tests { - use super::*; +impl OctopushCli { + pub fn new() -> Self { + let cmd = Command::new("octopush") + .version(VERSION) + .author("Kasper J. Hermansen ") + .about("Your cute action executor") + .propagate_version(true) + .subcommand_required(true) + .subcommand(commands::execute::execute_cmd()); - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + Self { cmd } + } + + pub async fn execute(self) -> eyre::Result<()> { + let matches = self.cmd.get_matches(); + + match matches.subcommand() { + Some(("execute", execute_sub)) => { + commands::execute::execute_subcommand(execute_sub).await?; + } + Some(_) => return Err(eyre::anyhow!("unknown subcommand, please see --help")), + None => return Err(eyre::anyhow!("no subcommand specified")), + } + + Ok(()) } } diff --git a/crates/octopush_core/Cargo.toml b/crates/octopush_core/Cargo.toml new file mode 100644 index 0000000..c100547 --- /dev/null +++ b/crates/octopush_core/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "octopush_core" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = { workspace = true } +eyre = { workspace = true } +tokio = { workspace = true } +rand = "0.8.5" +hex = "0.4.3" +git2 = "0.15.0" diff --git a/crates/octopush_core/src/git/github.rs b/crates/octopush_core/src/git/github.rs new file mode 100644 index 0000000..8d1d471 --- /dev/null +++ b/crates/octopush_core/src/git/github.rs @@ -0,0 +1,25 @@ +use crate::storage::DynStorageEngine; + +use super::GitProvider; + +pub struct GitHubGitProvider { + storage_engine: DynStorageEngine, +} + +impl GitHubGitProvider { + pub fn new(storage_engine: DynStorageEngine) -> Self { + Self { storage_engine } + } +} + +#[async_trait::async_trait] +impl GitProvider for GitHubGitProvider { + async fn clone_from_url(&self, url: String) -> eyre::Result<()> { + let dir = self.storage_engine.allocate_dir().await?; + + tokio::task::spawn_blocking(move || git2::Repository::clone(url.as_str(), dir.path())) + .await??; + + Ok(()) + } +} diff --git a/crates/octopush_core/src/git/mod.rs b/crates/octopush_core/src/git/mod.rs new file mode 100644 index 0000000..fdbc491 --- /dev/null +++ b/crates/octopush_core/src/git/mod.rs @@ -0,0 +1,9 @@ +use std::sync::Arc; + +pub mod github; + +#[async_trait::async_trait] +pub trait GitProvider { + async fn clone_from_url(&self, url: String) -> eyre::Result<()>; +} +pub type DynGitProvider = Arc; diff --git a/crates/octopush_core/src/lib.rs b/crates/octopush_core/src/lib.rs new file mode 100644 index 0000000..47b6a54 --- /dev/null +++ b/crates/octopush_core/src/lib.rs @@ -0,0 +1,2 @@ +pub mod git; +pub mod storage; diff --git a/crates/octopush_core/src/storage/local.rs b/crates/octopush_core/src/storage/local.rs new file mode 100644 index 0000000..411ff89 --- /dev/null +++ b/crates/octopush_core/src/storage/local.rs @@ -0,0 +1,51 @@ +use std::path::PathBuf; + +use rand::distributions::{DistString, Standard}; + +use super::StorageEngine; + +pub struct LocalStorageEngine { + root: PathBuf, +} + +impl LocalStorageEngine { + pub fn new(root: PathBuf) -> Self { + Self { root } + } +} + +#[async_trait::async_trait] +impl StorageEngine for LocalStorageEngine { + async fn allocate_dir(&self) -> eyre::Result { + let subdir_name = Standard.sample_string(&mut rand::thread_rng(), 2); + let mut path = self.root.clone(); + path.push(hex::encode(subdir_name)); + + Ok(super::TemporaryDir::new(path)) + } + + async fn cleanup(&self) -> eyre::Result<()> { + tokio::fs::remove_dir_all(self.root.clone()).await?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use crate::storage::StorageEngine; + + use super::LocalStorageEngine; + + #[tokio::test] + async fn create_local_storage_engine_and_allocate() { + let local_storage = LocalStorageEngine::new(PathBuf::new()); + + let dir = local_storage.allocate_dir().await.expect("to allocate dir"); + + assert_eq!(dir.path().to_string_lossy().len(), 16); + assert_eq!(dir.path().to_string_lossy().is_empty(), false); + } +} diff --git a/crates/octopush_core/src/storage/mod.rs b/crates/octopush_core/src/storage/mod.rs new file mode 100644 index 0000000..a7f1520 --- /dev/null +++ b/crates/octopush_core/src/storage/mod.rs @@ -0,0 +1,31 @@ +pub mod local; + +use std::{path::PathBuf, sync::Arc}; + +use async_trait::async_trait; + +#[async_trait] +pub trait StorageEngine { + async fn allocate_dir(&self) -> eyre::Result; + async fn cleanup(&self) -> eyre::Result<()>; +} + +pub type DynStorageEngine = Arc; + +pub struct TemporaryDir { + path: PathBuf, +} + +impl TemporaryDir { + pub fn new(path: PathBuf) -> Self { + Self { path } + } + + pub fn path(&self) -> PathBuf { + self.path.clone() + } + + pub fn cleanup(self) -> eyre::Result<()> { + Ok(()) + } +} diff --git a/crates/octopush_infra/Cargo.toml b/crates/octopush_infra/Cargo.toml new file mode 100644 index 0000000..0f8cd42 --- /dev/null +++ b/crates/octopush_infra/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "octopush_infra" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +octopush_core = { path = "../octopush_core" } + +eyre = { workspace = true } diff --git a/crates/octopush_infra/src/lib.rs b/crates/octopush_infra/src/lib.rs new file mode 100644 index 0000000..1ae5b5e --- /dev/null +++ b/crates/octopush_infra/src/lib.rs @@ -0,0 +1,16 @@ +pub mod service_register; + +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/octopush_infra/src/service_register.rs b/crates/octopush_infra/src/service_register.rs new file mode 100644 index 0000000..6527b6b --- /dev/null +++ b/crates/octopush_infra/src/service_register.rs @@ -0,0 +1,27 @@ +use std::sync::Arc; + +use octopush_core::{ + git::{github::GitHubGitProvider, DynGitProvider}, + storage::{local::LocalStorageEngine, DynStorageEngine}, +}; + +pub struct ServiceRegister { + pub storage_engine: DynStorageEngine, + pub git_provider: DynGitProvider, +} + +impl ServiceRegister { + pub fn new() -> Self { + let storage_engine = Arc::new(LocalStorageEngine::new("/tmp/octopush".into())); + let git_provider = Arc::new(GitHubGitProvider::new(storage_engine.clone())); + + Self { + storage_engine, + git_provider, + } + } + + pub async fn cleanup(self) -> eyre::Result<()> { + self.storage_engine.cleanup().await + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..8d20109 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ -fn main() { - println!("Hello, world!"); +#[tokio::main] +async fn main() -> eyre::Result<()> { + let cli = octopush_cli::OctopushCli::new(); + cli.execute().await }