Вы купили дорогой трекер 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
TODO
TODO
Для начала вам нужно создать новый мод и зарегистрировать его здесь назовем его example
.
Вы создаете мод, создавая файл src/handler/example.rs
и добавляя pub mod example;
в файл, указанный выше. В example.rs
должна быть общедоступная функция с именем async create_handler(setup: bool)
и эта функция должна возвращать структуру, реализующую Handler
Для реализации требуется аннотация #[async_trait]
Скорее всего, ваш мод потребует некоторой настройки. Вы можете реализовать всё в основном файле example.rs
, но чтобы сохранить чистоту, я рекомендую объявить новую 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
может создать структуру с материалом, который не сильно меняется, например, базовый 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
в перечисление 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