คุณเคยซื้อ Timeular tracker ราคาแพงมาและไม่อยากจ่ายเงินเพิ่มเพื่อซื้อแอพที่เป็นกรรมสิทธิ์ของพวกเขาหรือเปล่า? โครงการนี้เหมาะสำหรับคุณ ด้วย Timeular Reader คุณสามารถเชื่อมต่อตัวติดตามของคุณกับแอพติดตามเวลาที่คุณชื่นชอบ
ขั้นแรกให้รันคำสั่งด้วยแฟล็ก --setup
ซึ่งจะสร้างการกำหนดค่าและให้คุณติดป้ายกำกับด้านข้างของอุปกรณ์ของคุณ
timeular-reader --setup
คุณไม่จำเป็นต้องตั้งค่าทุกด้าน กด q ในด้านที่คุณไม่ต้องการใช้ จากนั้นการกำหนดค่าจะสร้างด้วยสิ่งที่คุณตั้งค่าไว้
หลังจากการตั้งค่าเริ่มต้น คุณสามารถแก้ไข config.toml
ได้
หากต้องการควบคุมความละเอียดของเอาต์พุต คุณสามารถส่ง --verbose
หรือ -v
คุณสามารถเพิ่มหลายรายการ -vvv
เพื่อให้ละเอียดยิ่งขึ้น
นอกจากนี้ยังมีโหมด --quiet
, -q
เพื่อปิดเสียงเอาต์พุตทั้งหมด
หากต้องการรับรหัสโปรเจ็กต์และรหัสพื้นที่ทำงาน ให้คลิกโปรเจ็กต์ที่แผงด้านซ้ายใต้จัดการ จากนั้นคลิกที่ชื่อโครงการที่คุณต้องการใช้ URL ควรมีลักษณะเช่นนี้ https://track.toggl.com/{workspace_id}/projects/{project_id}/team
หากต้องการสร้างคีย์ API ให้ไปที่การตั้งค่าโปรไฟล์ของคุณที่ด้านบนขวา หลังจากเลื่อนลง คุณจะเห็นตัวเลือกในการสร้างคีย์ API
หากต้องการรับรหัสพื้นที่ทำงานของคุณ ที่ด้านขวาบน ให้คลิกพื้นที่ทำงานของคุณ ไปที่จัดการ จากนั้นตั้งค่า คุณควรมีรหัสพื้นที่ทำงานอยู่ใน URL ควรมีลักษณะคล้าย https://app.clockify.me/workspaces/{workspace_id}/settings
รหัสโปรเจ็กต์ของหมายเหตุเป็นทางเลือก
หากต้องการรับรหัสโปรเจ็กต์ทางด้านซ้าย ให้คลิกโปรเจ็กต์ จากนั้นคลิกโปรเจ็กต์ของคุณ URL จะมีรหัสโครงการ ควรมีลักษณะเช่นนี้ https://app.clockify.me/projects/{project_id}/edit
สิ่งที่ต้องทำ
สิ่งที่ต้องทำ
ก่อนอื่นคุณต้องสร้าง mod ใหม่และลงทะเบียนที่นี่ ลองเรียกมันว่า example
คุณสร้างม็อดโดยการสร้างไฟล์ src/handler/example.rs
และเพิ่ม pub mod example;
ลงในไฟล์ตามลิงค์ด้านบน example.rs
ต้องมีฟังก์ชันสาธารณะที่เรียกว่า async create_handler(setup: bool)
และฟังก์ชันนั้นจะต้องส่งคืนโครงสร้างที่ใช้ Handler
การนำไปใช้งานจำเป็นต้องมีคำอธิบายประกอบ #[async_trait]
เป็นไปได้มากว่า mod ของคุณจะต้องมีการกำหนดค่าบางอย่าง คุณสามารถปรับใช้ทุกอย่างในไฟล์ example.rs
หลักได้ แต่เพื่อรักษาความสะอาด ฉันขอแนะนำให้ประกาศ new mod config
config mod จะรับผิดชอบในการสร้างการกำหนดค่าเริ่มต้นและบันทึกลงในไฟล์กำหนดค่าหลัก 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
สามารถสร้างโครงสร้างด้วยสิ่งที่ไม่เปลี่ยนแปลงมากนัก เช่น URL ฐาน API ตัวอย่างเช่น:
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
คุณต้องเพิ่ม Example
mod ของเราไปที่ Handlers
enum และกำหนดหมายเลขให้กับมัน
pub enum Handlers {
Toggl = 1,
Clockify = 2,
Traggo = 3,
Hackaru = 4,
+ Example = 5,
}
จากนั้นเราจะต้องปรับ TryFrom<u8>
:
fn try_from(v: u8) -> Result<Self, Self::Error> {
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<Self, Self::Error> {
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<dyn Handler> {
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