값비싼 Timeular 트래커를 구입했는데 전용 앱에 추가 비용을 지불하고 싶지 않으신가요? 이 프로젝트는 당신을 위한 것입니다. Timeular Reader를 사용하면 트래커를 즐겨 사용하는 시간 추적 앱에 연결할 수 있습니다.
먼저 --setup
플래그와 함께 명령을 실행하면 구성이 생성되고 장치 측면에 레이블을 지정할 수 있습니다.
timeular-reader --setup
모든 면을 설정할 필요는 없습니다. 사용하고 싶지 않은 면에서 q를 누르면 설정한 면으로 구성이 생성됩니다.
초기 설정 후 config.toml
수정할 수 있습니다.
출력의 자세한 정도를 제어하려면 --verbose
또는 -v
전달할 수 있으며, -vvv
여러 개 추가하여 더 자세한 내용을 만들 수 있습니다.
모든 출력을 음소거하는 --quiet
, -q
모드도 있습니다.
프로젝트 ID와 작업공간 ID를 얻으려면 왼쪽 패널의 관리 아래에서 프로젝트를 클릭하세요. 그런 다음 사용하려는 프로젝트 이름을 클릭합니다. URL은 https://track.toggl.com/{workspace_id}/projects/{project_id}/team
과 같아야 합니다.
API 키를 생성하려면 오른쪽 상단의 프로필 설정으로 이동하세요. 아래로 스크롤하면 API 키 생성 옵션이 표시됩니다.
워크스페이스 ID를 얻으려면 오른쪽 상단에서 내 워크스페이스를 클릭하고 관리로 이동한 다음 설정으로 이동하세요. URL에 워크스페이스 ID가 있어야 합니다. https://app.clockify.me/workspaces/{workspace_id}/settings
와 유사해야 합니다.
참고 프로젝트 ID는 선택사항입니다.
왼쪽에서 프로젝트 ID를 확인하려면 프로젝트를 클릭한 다음 프로젝트를 클릭하세요. URL에는 프로젝트 ID가 포함됩니다. 다음과 같아야 합니다 https://app.clockify.me/projects/{project_id}/edit
TODO
TODO
먼저 새 모드를 생성하고 여기에 등록해야 합니다. example
라고 하겠습니다.
src/handler/example.rs
파일을 생성하고 pub mod example;
위에 링크된 파일에 넣으세요. example.rs
async create_handler(setup: bool)
이라는 공개 함수가 있어야 하며 해당 함수는 Handler
구현하는 구조체를 반환해야 합니다. 구현에는 #[async_trait]
주석이 필요합니다.
모드에 일부 구성이 필요할 가능성이 높습니다. 기본 example.rs
파일에서 모든 것을 구현할 수 있지만 깔끔하게 유지하려면 새로운 mod config
선언하는 것이 좋습니다. 구성 모드는 기본 구성을 생성하고 이를 기본 구성 파일인 config.toml
에 저장하는 일을 담당합니다.
먼저 pub mod config;
example.rs
로 이동하여 src/handler/example/config.rs
파일을 만듭니다. config.rs
에서 우리는 필요한 모든 구성 데이터를 담을 구조체를 생성해야 합니다. 이를 ExampleConfig
라고 부르겠습니다.
파생상품이 꼭 필요하다
# [ derive ( Serialize , Deserialize , Clone , Debug ) ]
pub struct ExampleConfig {
base_url : String ,
api_key : String ,
}
그런 다음 Default
및 crate::config::Config
구현해야 합니다. Default
구현은 API 기본 URL과 같이 많이 변경되지 않는 항목으로 구조체를 생성할 수 있습니다. 예를 들어:
impl Default for ExampleConfig {
fn default ( ) -> Self {
ExampleConfig {
base_url : String :: from ( "https://api.example.com" ) ,
api_key : String :: new ( ) ,
}
}
}
crate::config::Config
구현은 비어 있을 수 있으며 유형과 수명을 상속하는 것에 관한 것이며 다음과 같습니다.
impl < ' de > Config < ' de > for ExampleConfig { }
구성을 기본 구성 파일로 저장하려면 해당 파일이 저장될 고유 키가 있어야 합니다.
편의를 위해 구성(파일에서/파일로)을 가져오고 업데이트하는 메서드를 구현할 수 있습니다. 그렇지 않으면 crate::config::get_config
및 crate::config::update_config
호출해야 합니다. 이러한 기능은 다음과 같습니다.
const CONFIG_KEY : & str = "example" ; pub fn create_config ( ) -> ExampleConfig { crate :: config :: get_config :: < ExampleConfig > ( CONFIG_KEY ) } pub fn update_config ( config : & ExampleConfig ) { crate :: config :: update_config ( CONFIG_KEY , config ) ; }
그런 다음 새 핸들러를 등록해야 합니다. src/handler.rs
에서 Mod Example
Handlers
열거형에 추가하고 번호를 할당해야 합니다.
pub enum Handlers {
Toggl = 1,
Clockify = 2,
Traggo = 3,
Hackaru = 4,
+ Example = 5,
}
그런 다음 TryFrom
조정해야 합니다.
fn try_from(v: u8) -> Result {
match v {
x if x == Handlers::Toggl as u8 => Ok(Handlers::Toggl),
x if x == Handlers::Clockify as u8 => Ok(Handlers::Clockify),
x if x == Handlers::Traggo as u8 => Ok(Handlers::Traggo),
x if x == Handlers::Hackaru as u8 => Ok(Handlers::Hackaru),
+ x if x == Handlers::Example as u8 => Ok(Handlers::Example),
_ => Err(()),
}
}
TryFrom<&String>
에서도 동일합니다.
fn try_from(v: &String) -> Result {
match v.as_str() {
"toggl" => Ok(Handlers::Toggl),
"clockify" => Ok(Handlers::Clockify),
"traggo" => Ok(Handlers::Traggo),
"hackaru" => Ok(Handlers::Hackaru),
+ "example" => Ok(Handlers::Example),
_ => Err(()),
}
}
마지막으로 해야 할 일은 get_handler
에서 팩토리 메소드를 조정하는 것입니다.
pub async fn get_handler(setup: bool, config: &TimeularConfig) -> Box {
match config.handler.as_str() {
"toggl" => Box::new(toggl::create_handler(setup).await),
"hackaru" => Box::new(hackaru::create_handler(setup).await),
"clockify" => Box::new(clockify::create_handler(setup).await),
"traggo" => Box::new(traggo::create_handler(setup).await),
+ "example" => Box::new(example::create_handler(setup).await),
_ => Box::new(example::create_handler(setup).await),
}
}
저장소에 예제 추적기를 추가했습니다. 이를 기반으로 모듈을 만들 수 있습니다.
간단히 실행
cargo build