هل اشتريت جهاز التعقب Timeular باهظ الثمن ولا تريد أن تدفع علاوة على ذلك مقابل التطبيق الخاص به؟ هذا المشروع هو لك. باستخدام 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
المهام
المهام
تحتاج أولاً إلى إنشاء نموذج جديد وتسجيله هنا، فلنسميه example
.
يمكنك إنشاء التعديل عن طريق إنشاء ملف src/handler/example.rs
وإضافة pub mod example;
في الملف المرتبط أعلاه. يجب أن يحتوي example.rs
على وظيفة عامة تسمى async create_handler(setup: bool)
ويجب أن تُرجع هذه الوظيفة بنية تقوم بتنفيذ Handler
يحتاج التنفيذ إلى تعليق توضيحي #[async_trait]
من المرجح أن تعديلك سيتطلب بعض التكوين. يمكنك تنفيذ كل شيء في ملف example.rs
الرئيسي، ولكن للحفاظ على نظافته أوصي بالإعلان عن 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
and crate::config::Config
. يمكن للتنفيذ Default
إنشاء البنية باستخدام العناصر التي لا تتغير كثيرًا، مثل عنوان 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
تحتاج إلى إضافة Example
التعديل الخاص بنا إلى تعداد Handlers
وتعيين رقم له.
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